题目名称

给你一个链表的头节点 head,请你编写代码,反复删去链表中由 总和 值为 0 的连续节点组成的序列,直到不存在这样的序列为止。

删除完毕后,请你返回最终结果链表的头节点。

你可以返回任何满足题目要求的答案。

示例

输入:head = [1,2,-3,3,1]
输出:[3,1]
提示:答案 [1,2,1] 也是正确的。

输入:head = [1,2,3,-3,4]
输出:[1,2,4]

题解

首先将链表转成数组,然后计算数组的每一位与前面所有位置的和,然后去除两个和相等的中间所有元素(不包含前一个和的位置,但包含后一个和的位置)

然后进行循环操作,直到找不到和为0的区间

然后将数组转成链表输出

答案

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var removeZeroSumSublists = function(head) {
let list = []
let nHead = head
while(nHead) {
list.push(nHead.val)
nHead = nHead.next
}
let needContinue = true
while(needContinue) {
let sum = [0]
for(let i = 0; i < list.length; i++) {
sum[i + 1] = sum[i] + list[i]
}
let start = -1, end = 0
for(let i = 0; i < sum.length; i++) {
end = i
start = -1
for(let j = i - 1; j >= 0; j--) {
if(sum[i] === sum[j]) {
start = j
}
}
if(start !== -1) {
break
}
}
if(start !== -1) {
list.splice(start, end - start)
} else {
needContinue = false
}
}
let newHead = new ListNode()
let node = newHead
for(let i = 0; i < list.length; i++) {
if(list[i]) {
node.next = new ListNode(list[i])
node = node.next
}
}
return newHead.next
};