Remove Zero Sum Consecutive Nodes from Linked List

medium linked list prefix sum hash map

Problem

Given the head of a linked list, repeatedly delete consecutive sequences of nodes that sum to 0 until there are no such sequences. After doing so, return the head of the final linked list. You may return any such answer.

Inputhead = [1, 2, -3, 3, 1]
Output[3, 1]
The sequence 2, -3, 1 (or 1, 2, -3) sums to 0, so those nodes are removed, leaving [3, 1].

def removeZeroSumSublists(head):
    dummy = ListNode(0)
    dummy.next = head
    prefix = 0
    seen = {0: dummy}
    node = dummy
    while node:
        prefix += node.val
        seen[prefix] = node
        node = node.next
    prefix = 0
    node = dummy
    while node:
        prefix += node.val
        node.next = seen[prefix].next
        node = node.next
    return dummy.next
function removeZeroSumSublists(head) {
  const dummy = new ListNode(0);
  dummy.next = head;
  let prefix = 0;
  const seen = new Map([[0, dummy]]);
  for (let node = dummy; node; node = node.next) {
    prefix += node.val;
    seen.set(prefix, node);
  }
  prefix = 0;
  for (let node = dummy; node; node = node.next) {
    prefix += node.val;
    node.next = seen.get(prefix).next;
  }
  return dummy.next;
}
class Solution {
    public ListNode removeZeroSumSublists(ListNode head) {
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        int prefix = 0;
        Map<Integer, ListNode> seen = new HashMap<>();
        seen.put(0, dummy);
        for (ListNode node = dummy; node != null; node = node.next) {
            prefix += node.val;
            seen.put(prefix, node);
        }
        prefix = 0;
        for (ListNode node = dummy; node != null; node = node.next) {
            prefix += node.val;
            node.next = seen.get(prefix).next;
        }
        return dummy.next;
    }
}
ListNode* removeZeroSumSublists(ListNode* head) {
    ListNode* dummy = new ListNode(0);
    dummy->next = head;
    int prefix = 0;
    unordered_map<int, ListNode*> seen;
    seen[0] = dummy;
    for (ListNode* node = dummy; node; node = node->next) {
        prefix += node->val;
        seen[prefix] = node;
    }
    prefix = 0;
    for (ListNode* node = dummy; node; node = node->next) {
        prefix += node->val;
        node->next = seen[prefix]->next;
    }
    return dummy->next;
}
Time: O(n) Space: O(n)