题目名称
给你一个链表的头节点 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
|
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 };
|