1. 题目
给你一个链表的头节点 head,请你编写代码,反复删去链表中由 总和 值为 0 的连续节点组成的序列,直到不存在这样的序列为止。
删除完毕后,请你返回最终结果链表的头节点。
你可以返回任何满足题目要求的答案。
(注意,下面示例中的所有序列,都是对 ListNode 对象序列化的表示。)示例 1:
输入:head = [1,2,-3,3,1]
输出:[3,1]
提示:答案 [1,2,1] 也是正确的。示例 2:
输入:head = [1,2,3,-3,4]
输出:[1,2,4]示例 3:
输入:head = [1,2,3,-3,-2]
输出:[1]提示:
给你的链表中可能有 1 到 1000 个节点。
对于链表中的每个节点,节点的值:-1000 <= node.val <= 1000.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-zero-sum-consecutive-nodes-from-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 哈希表
- 建立包含当前节点的前缀和sum为Key,当前节点指针为Value的哈希表
- 当sum在哈希表中存在时,两个sum之间的链表可以删除
- 先将中间的要删除段的哈希表清除,再断开链表
- 循环执行以上步骤
class Solution {
public:ListNode* removeZeroSumSublists(ListNode* head) {if(head == NULL)return NULL;ListNode *newHead = new ListNode(0);//为方便处理添加哨兵,值为0newHead->next = head;ListNode *prev = newHead, *cur = head, *temp;unordered_map<int,ListNode*> m;m[0] = prev;//哨兵添加进哈希表int sum = 0, s;unordered_map<int,ListNode*>::iterator it;while(cur != NULL){sum += cur->val;it = m.find(sum);if(it == m.end())m[sum] = cur;else//找到了一样的值{temp = it->second->next;s = it->first + temp->val;while(s != sum)//清空待删除段的哈希表{m.erase(s);temp = temp->next;s += temp->val;}it->second->next = cur->next;//断开中间的sum为0链表段sum = it->first;//sum重置为删除段前面的}cur = cur->next;}ListNode *ans = newHead->next;delete newHead;//释放哨兵return ans;}
};