1.用一个字典存储前缀和,如果两个节点对应的前缀和相同,那么他们之间的节点总和值为零。首先遍历一遍链表,把所有的前缀和存起来,第二遍遍历,找当前前缀和对应的节点。
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def removeZeroSumSublists(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
# 前缀和
p=ListNode(0)
p.next=head
valsum={}
presum=0
cur=p
while(cur):
presum+=cur.val
valsum[presum]=cur
cur=cur.next
presum=0
cur=p
while(cur):
presum+=cur.val
cur.next=valsum[presum].next
cur=cur.next
return p.next
2.递归调用,注意while循环不能从p开始,要从head开始
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def removeZeroSumSublists(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
# 前缀和
p=ListNode(0)
p.next=head
valsum={0:p}
presum=0
cur=head
while(cur):
presum+=cur.val
if presum in valsum:
valsum[presum].next=cur.next
return self.removeZeroSumSublists(p.next)
else:
valsum[presum]=cur
cur=cur.next
return p.next