题目要求连续节点总和为0,这也就是说对这个链表做前缀和处理时这些连续节点的前后节点的前缀和相同。反过来想,如果有一个节点的前缀和和后面某个节点的前缀和相同,说明中间的和为0,可以删掉。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* removeZeroSumSublists(ListNode* head) {
ListNode* p =new ListNode(0);
p->next=head;
unordered_map<int,ListNode*>k;
int pre=0;
for(ListNode* cur=p;cur;cur=cur->next)
{
pre+=cur->val;
k[pre]=cur;
}
pre=0;
for(ListNode* cur=p;cur;cur=cur->next)
{
pre+=cur->val;
cur->next=k[pre]->next;
}
return p->next;
}
};