1171. 从链表中删去总和值为零的连续节点

83 阅读1分钟

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