---
# System prepended metadata

title: '[1171. Remove Zero Sum Consecutive Nodes from Linked List](https://leetcode.com/problems/remove-zero-sum-consecutive-nodes-from-linked-list/)'
tags: [leetcode]

---

---
tags: leetcode
---

# [1171. Remove Zero Sum Consecutive Nodes from Linked List](https://leetcode.com/problems/remove-zero-sum-consecutive-nodes-from-linked-list/)
---
# My Solution
## Solution 1:
### The Key Idea for Solving This Coding Question
Brute force.
### C++ Code
```cpp=
/**
 * 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;
        }
    }
};
```
### Time Complexity
$O(n^{2})$
$n$ is the number of nodes in the linked list.
### Space Complexity
$O(1)$
## Solution 2:
### The Key Idea for Solving This Coding Question
Prefix sum and hash table.
### C++ Code 1 (One Pass)
```cpp=
/**
 * 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;
    }
};
```
### Code 2 (Two Passes)
```cpp=
/**
 * 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;
    }
};
```
### Time Complexity
$O(n)$
$n$ is the number of nodes in the linked list.
### Space Complexity
$O(n)$
# Miscellaneous
<!--
# Test Cases
```
[1,2,-3,3,1]
```
```
[1,2,3,-3,4]
```
```
[1,2,3,-3,-2]
```
```
[1]
```
```
[0]
```
```
[1,2,3,-6,6,2,4,1,2,3,-6]
```
```
[0,0,0,0,0]
```
```
[1,2,3,-6,1,2,3,-6]
```
```
[1,2,3,4,5,6,7]
```
```
[1,3,2,-3,-2,5,100,-100,1]
```
```
[1,3,2,-3,-2,5,5,-5,1]
```
-->