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

给你一个链表的头节点 head,请你编写代码,反复删去链表中由 总和 值为 0 的连续节点组成的序列,直到不存在这样的序列为止。

删除完毕后,请你返回最终结果链表的头节点。

 

你可以返回任何满足题目要求的答案。

(注意,下面示例中的所有序列,都是对 ListNode 对象序列化的表示。)

 

提示:

  • 给你的链表中可能有 1 到 1000 个节点。
  • 对于链表中的每个节点,节点的值:-1000 <= node.val <= 1000.

思路:

emmm打竞赛要的是快和稳,所以我用了比较瓜但是很快也很稳的转数组操作的方法……

# 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
        """
        if not head.next:
            return head if head.val != 0 else None
        l = []
        p = head
        while p: #转数组
            l.append(p.val)
            p = p.next
        
        l = self.remove(l)
        newhead = ListNode(-1)
        p = newhead
        for num in l: #转回链表
            p.next = ListNode(num)
            p = p.next
        return newhead.next
    
    def remove(self, l): #在一个数组里把连续和为0的部分删除
        for i in range(len(l)):
            s = l[i]
            j = i + 1
            while j <= len(l):
                # print s, l
                if s == 0:
                    return self.remove(l[:i] + l[j:]) #递归处理
                else:
                    if j == len(l):
                        break
                    s += l[j]
                    j += 1
        return l #没有需要删除的就直接返回原数组

正规面试还是应该用下面的解法:

用一个变量pre_sum记录前缀和,

再用一个哈希表记录出现过的前缀和,如果出现了两个相同的前缀和,就说明中间这一段的和为0,是多余的。

举例:

对于输入 [1, 2, -2, 3, -1, -1, -1],前缀和为[1, 3, 1, 4, 3, 2, 1],下标为0的1和下标为2的1相同,就代表下标在【1, 2】间的元素的和为0。

# 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
        """
        dummy = ListNode(-1)
        dummy.next = head
        
        record = {0:dummy} 
        pre_sum = 0
        
        while head:
            pre_sum += head.val
            if pre_sum in record: #说明【record[pre_sum], head】的所有节点的和为0
                record[pre_sum].next = head.next
            else:
                record[pre_sum] = head
            head = head.next

        return dummy.next

 

你可能感兴趣的:(Leetcode)