1171. Remove Zero Sum Consecutive Nodes from Linked List

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Solution {
public ListNode removeZeroSumSublists(ListNode head) {
ListNode dummyHead = new ListNode(-1, head);
Map<Integer, ListNode> prefixSumToNodeMap = new HashMap<>();
prefixSumToNodeMap.put(0, dummyHead);

int prefixSum = 0; // 截止至当前元素的前缀和(包含当前元素)

ListNode curr = head;
while (curr != null) {
prefixSum += curr.val;
ListNode prevNode = prefixSumToNodeMap.get(prefixSum);
if (prevNode != null) {
ListNode node = prevNode.next;
int tempSum = prefixSum;
while (node.next != curr.next) {
tempSum += node.val;
prefixSumToNodeMap.remove(tempSum);
node = node.next;
}

prevNode.next = curr.next;
} else {
prefixSumToNodeMap.put(prefixSum, curr);
}

curr = curr.next;
}

return dummyHead.next;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public ListNode removeZeroSumSublists(ListNode head) {
ListNode dummyHead = new ListNode(-1, head);
Map<Integer, ListNode> prefixSumToNodeMap = new HashMap<>();
int prefixSum = 0; // 截止至当前元素的前缀和(包含当前元素)
for (ListNode curr = dummyHead; curr != null; curr = curr.next) {
prefixSum += curr.val;
prefixSumToNodeMap.put(prefixSum, curr); // 相同前缀和的保留最后一个出现的节点
}

prefixSum = 0;
for (ListNode curr = dummyHead; curr != null; curr = curr.next) {
prefixSum += curr.val;
curr.next = prefixSumToNodeMap.get(prefixSum).next;
}

return dummyHead.next;
}
}

References

1171. Remove Zero Sum Consecutive Nodes from Linked List