题目名称
给你一个链表的头节点 head,请你编写代码,反复删去链表中由 总和 值为 0 的连续节点组成的序列,直到不存在这样的序列为止。
删除完毕后,请你返回最终结果链表的头节点。
你可以返回任何满足题目要求的答案。
示例
输入:head = [1,2,-3,3,1]
输出:[3,1]
提示:答案 [1,2,1] 也是正确的。
输入:head = [1,2,3,-3,4]
输出:[1,2,4]
题解
首先将链表转成数组,然后计算数组的每一位与前面所有位置的和,然后去除两个和相等的中间所有元素(不包含前一个和的位置,但包含后一个和的位置)
然后进行循环操作,直到找不到和为0的区间
然后将数组转成链表输出
答案
| 12
 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
 
 | 
 
 
 
 
 
 
 
 
 
 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
 };
 
 |