Brute force.
/**
* 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 *dummy = new ListNode(), *prev = dummy;
dummy->next = head;
while (prev != nullptr) {
int sum = 0;
ListNode *left = prev->next, *right = prev->next;
while (right != nullptr) {
sum += right->val;
if (sum == 0) {
prev->next = right->next;
//deleteNodes(left, right);
left = prev->next;
right = prev->next;
} else {
right = right->next;
}
}
prev = prev->next;
}
head = dummy->next;
delete dummy;
return head;
}
private:
void deleteNodes(ListNode *left, ListNode *right) {
right->next = nullptr;
ListNode *it = left;
while (it != nullptr) {
ListNode *x = it;
it = it->next;
delete x;
}
}
};
Prefix sum and hash table.
/**
* 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 *dummy = new ListNode(0), *curr = dummy;
unordered_map<int, ListNode *> htbl;
int prefixSum = 0;
dummy->next = head;
while (curr != nullptr) {
prefixSum += curr->val;
auto iter = htbl.find(prefixSum);
if (iter == htbl.end()) {
// No zero sum.
htbl[prefixSum] = curr;
curr = curr->next;
} else {
// Find zero sum.
// The sum between iter->second->next to curr is zero.
ListNode *x = iter->second->next;
// Remove the consecutive nodes that sum to zero.
iter->second->next = curr->next;
curr = curr->next;
// clear invalid records from htbl.
int prefixTmp = prefixSum;
while (true) {
prefixTmp += x->val;
if (prefixSum == prefixTmp) {
break;
}
htbl.erase(prefixTmp);
x = x->next;
}
}
}
head = dummy->next;
delete dummy;
return head;
}
};
/**
* 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) {
unordered_map<int, ListNode *> htbl;
int prefixSum = 0;
ListNode *dummy = new ListNode(0);
dummy->next = head;
for (ListNode *it = dummy; it != nullptr; it = it->next) {
prefixSum += it->val;
htbl[prefixSum] = it;
}
prefixSum = 0;
for (ListNode *it = dummy; it != nullptr; it = it->next) {
prefixSum += it->val;
it->next = htbl[prefixSum]->next;
}
head = dummy->next;
delete dummy;
return head;
}
};
My Solution Solution 1: DFS (recursion) The Key Idea for Solving This Coding Question C++ Code /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right;
Jun 6, 2025MyCircularQueueO(k)
Apr 20, 2025O(m)
Mar 4, 2025O(n)n is the length of nums.
Feb 19, 2025or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up