1 """ 2 Given the head of a linked list, we repeatedly delete consecutive sequences of nodes that sum to 0 until there are no such sequences. 3 4 After doing so, return the head of the final linked list. You may return any such answer. 5 6 7 8 (Note that in the examples below, all sequences are serializations of ListNode objects.) 9 10 Example 1: 11 12 Input: head = [1,2,-3,3,1] 13 Output: [3,1] 14 Note: The answer [1,2,1] would also be accepted. 15 16 Example 2: 17 18 Input: head = [1,2,3,-3,4] 19 Output: [1,2,4] 20 21 Example 3: 22 23 Input: head = [1,2,3,-3,-2] 24 Output: [1] 25 26 """ 27 class ListNode(object): 28 def __init__(self, x): 29 self.val = x 30 self.next = None 31 32 class Solution1(object): 33 def removeZeroSumSublists(self, head): 34 """ 35 :param head: ListNode 36 :return: ListNode 37 """ 38 if not head.next: 39 return head if head.val != 0 else None #判断头节点是为否为空 40 list = [] #建立list存储链表转化后的数组 41 p = head #建立p指针指向头结点 42 while(p): #将链表转为数组 43 list.append(p.val) 44 p = p.next 45 list = self.remove(list) #!!!删除连续和为0 46 newhead = ListNode(-1) #建立新的头结点 47 p = newhead #p指向新的头结点 48 for num in list: #将结果数组转成链表 49 p.next = ListNode(num) 50 p = p.next 51 return newhead.next 52 """ 53 在一个数组里把连续和为0的部分删除,两层循环:用i对每个元素遍历 54 再用j不断的对当前子数组求和,若为0,删除当前部分并进行递归 55 """ 56 def remove(self, list): #在一个数组里把连续和为0的部分删除 57 for i in range(len(list)): 58 sum = list[i] 59 j = i + 1 60 while(j <= len(list)): 61 if sum == 0: 62 return self.remove(list[:i] + list[j:]) #递归处理 63 else: 64 if j == len(list): 65 break 66 sum += list[j] 67 j += 1 68 return list 69 70 """ 71 用一个变量pre_sum记录前缀和,再用一个哈希表记录出现过的前缀和, 72 如果出现了两个相同的前缀和,就说明中间这一段的和为0,是多余的。 73 举例: 74 对于输入 [1, 2, -2, 3, -1, -1, -1], 75 前缀和为[1, 3, 1, 4, 3, 2, 1], 76 下标为0的1和下标为2的1相同, 77 就代表下标在【1, 2】间的元素的和为0。 78 """ 79 class Solution2(object): 80 def removeZeroSumSublists(self, head): 81 """ 82 :param head: ListNode 83 :return: ListNode 84 """ 85 dummy = ListNode(-1) #用一个假头结点dummy返回结果, 86 dummy.next = head #防止头节点head被删除无法返回 87 pre_sum = 0 #记录前缀和 88 record = {0: dummy} # 用dict来存出现过的每个前缀和 89 # bug代码record = {0,dummy} 这里需要对record初始化{:} 90 while head: 91 pre_sum += head.val # bug代码 马虎没有写'+' 92 if pre_sum in record: 93 record[pre_sum].next = head.next #寻找是否有重复的元素 94 else: #类似于leetcode1:twoSum 95 record[pre_sum] = head 96 head = head.next 97 return dummy.next #用dummy来返回结果 98 """ 99 Wrong answer 100 Input 101 [1,3,2,-3,-2,5,5,-5,1] 102 Output 103 [1,5,5,-5,1] 104 Expected 105 [1,5,1] 106 """