1. 程式人生 > 實用技巧 >LeetCode 1171. 從連結串列中刪去總和值為零的連續節點

LeetCode 1171. 從連結串列中刪去總和值為零的連續節點

1171. 從連結串列中刪去總和值為零的連續節點

Difficulty: 中等

給你一個連結串列的頭節點head,請你編寫程式碼,反覆刪去連結串列中由 總和值為 0 的連續節點組成的序列,直到不存在這樣的序列為止。

刪除完畢後,請你返回最終結果連結串列的頭節點。

你可以返回任何滿足題目要求的答案。

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

示例 1:

輸入:head = [1,2,-3,3,1]
輸出:[3,1]
提示:答案 [1,2,1] 也是正確的。

示例 2:

輸入:head = [1,2,3,-3,4]
輸出:[1,2,4]

示例 3:

輸入:head = [1,2,3,-3,-2]
輸出:[1]

提示:

  • 給你的連結串列中可能有 11000個節點。
  • 對於連結串列中的每個節點,節點的值:-1000 <= node.val <= 1000.

Solution

Language: ****

# Definition for singly-linked list.
# class ListNode:
#   def __init__(self, x):
#     self.val = x
#     self.next = None
​
​
class Solution:
  def removeZeroSumSublists(self, head: ListNode) -> ListNode:
    dummy = p = ListNode(-1)
    dummy.next = head
    prefix, d = 0, {}
    # 字首和
    while p:
      # 求節點累計的和
      prefix += p.val
      # 從hash表中找到滿足累計和的節點,如果沒有則把p賦給node
      node = d.get(prefix, p)
      # 當累計和出現在hash表中的時候,把從第一個符合累計和的節點以及它後面的節點從雜湊表中移除
      while prefix in d:
        d.popitem()
      # 直接從node.next到p.next,中間的節點全部忽略
      d[prefix] = node
      p = p.next
      node.next = p
    return dummy.next