• leeetcode1171 Remove Zero Sum Consecutive Nodes from Linked List


      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 """
  • 相关阅读:
    Java编程的逻辑 (74)
    Java编程的逻辑 (73)
    Java编程的逻辑 (72)
    Java编程的逻辑 (71)
    Java编程的逻辑 (70)
    Java编程的逻辑 (69)
    Java编程的逻辑 (68)
    Java编程的逻辑 (67)
    透视校正插值
    摄像机成像模型
  • 原文地址:https://www.cnblogs.com/yawenw/p/12250481.html
Copyright © 2020-2023  润新知