题目:
给你一个链表的头节点 head,请你编写代码,反复删去链表中由 总和 值为 0 的连续节点组成的序列,直到不存在这样的序列为止。
删除完毕后,请你返回最终结果链表的头节点。
你可以返回任何满足题目要求的答案。
(注意,下面示例中的所有序列,都是对 ListNode 对象序列化的表示。)
算法:
方法一:前缀和
加上”和为0的连续节点“,前缀和不变,利用这个特性,找到”和为0的连续节点“,并删除。用map[sum]*ListNode 记录前缀和为sum的最后一个节点。
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func removeZeroSumSublists(head *ListNode) *ListNode {
dummy := &ListNode{
Next:head,
}
mem := make(map[int]*ListNode)
mem[0] = dummy
sum := 0
node := head
for node != nil {
sum = sum + node.Val
if p, ok := mem[sum]; ok {
del := p.Next
p.Next = node.Next
for del != node {
sum = sum + del.Val
delete(mem, sum)
del = del.Next
}
sum = sum + del.Val
} else {
mem[sum] = node
}
node = node.Next
}
return dummy.Next
}