鍊表應用: 簡化鏈結串列 Remove Zero Sum Nodes_Leetcode #1171

更新於 發佈於 閱讀時間約 4 分鐘

題目敘述

題目會給定一個鏈結串列的起始點,要求我們把其中區間總和為0的部分刪除掉

例如

1→ 2 → -2 → 3 → 4

裡面有一段是2 → -2 區間總和為零,所以簡化刪除後變成

1→ 3 → 4


題目的原文敘述


測試範例

Example 1:

Input: head = [1,2,-3,3,1]
Output: [3,1]
Note: The answer [1,2,1] would also be accepted.

Example 2:

Input: head = [1,2,3,-3,4]
Output: [1,2,4]

Example 3:

Input: head = [1,2,3,-3,-2]
Output: [1]

約束條件

Constraints:

  • The given linked list will contain between 1 and 1000 nodes.

鏈結串列的節點總數目介於1~1000。

  • Each node in the linked list has -1000 <= node.val <= 1000.

節點值都介於-1000 ~ 1000之間。


演算法 前綴和 + 字典

這題會用到以前學過的前綴和技巧。

從左到右滾動依序計算前綴和,並且把每個前綴和對應的節點存到字典裡面

如果當下在某個位置前綴和為S,而且在字典裡面又發現前面曾經看過前綴和S,
那麼代表從前面到現在這個位置,區間的區間總和恰為0。


舉個實際的例子幫助讀者理解

假設輸入為 12-234

前綴和分別為

1, 3, 1, 4, 8

前綴和1看過兩次,代表區間 2 → -2 的區間節點總和為0,也就是我們要簡化刪除的地方。

簡化之後,新的鏈結串列變成

1→ 3 → 4


示意圖

image.png

image.png



程式碼 前綴和 + 字典

class Solution:
def removeZeroSumSublists(self, head: ListNode) -> ListNode:

# DummyHead makes zero sum handling easier
dummyHead = ListNode(0, head)

# prefix sum so far
prefixSum = 0

## Dictionay:
# key: prefix sum
# value: right most node who has this prefix sum
rightMost = {0: dummyHead}

# Update right most position for each prefix sum
cur = head
while cur:
prefixSum += cur.val
rightMost[prefixSum] = cur
cur = cur.next


# Skip and connect to right most position for already know prefix sum
cur, prefixSum = dummyHead, 0
while cur:
prefixSum += cur.val
junction = rightMost.get(prefixSum, cur)
cur.next = junction.next
cur = cur.next

return dummyHead.next

複雜度分析 前綴和 + 字典

時間複雜度:

線性掃描兩次,所需時間為O(n)。


空間複雜度:

需要建立一個前綴和字典,所需空間為O(n)。


關鍵知識點

同樣的前綴和若出現兩次以上,代表存在有區間總和為0的區間

Reference:

[1] Remove Zero Sum Consecutive Nodes from Linked List - LeetCode

avatar-img
95會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言
avatar-img
留言分享你的想法!
題目敘述 題目會給我們一個鏈結串列的起點head,要求我們找出這個串列的中點。 註: 如果串列長度是偶數,就回傳中間偏右的那個節點。 例如: 1 -> 2 -> 3 回傳中點為2 1 -> 2 -> 3 -> 4 ->5 -> 6 回傳中點為4 詳細的題目可在這裡看到 測試範例
題目會給定一個帶有Random Pointer的鏈結串列,要求我們實體複製deep copy這條鏈結串列,並且輸出副本的根結點。
題目會給定我們一個串列,和一個n值,要求我們刪除尾巴數來的第n個節點。 例如 1->2->3->4->5 和 給定n值=2,要求我們刪除尾巴數來的第2個節點。 尾巴數來的第2個節點是4,刪除之後,更新連結,輸出答案如下 1->2->3->5
題目會給我們兩條已經從小到大排序好的串列,要求我們依照從小到大的順序,合併這兩條串列。
題目敘述 題目會給我們一個鏈結串列的起點head,要求我們找出這個串列的中點。 註: 如果串列長度是偶數,就回傳中間偏右的那個節點。 例如: 1 -> 2 -> 3 回傳中點為2 1 -> 2 -> 3 -> 4 ->5 -> 6 回傳中點為4 詳細的題目可在這裡看到 測試範例
題目會給定一個帶有Random Pointer的鏈結串列,要求我們實體複製deep copy這條鏈結串列,並且輸出副本的根結點。
題目會給定我們一個串列,和一個n值,要求我們刪除尾巴數來的第n個節點。 例如 1->2->3->4->5 和 給定n值=2,要求我們刪除尾巴數來的第2個節點。 尾巴數來的第2個節點是4,刪除之後,更新連結,輸出答案如下 1->2->3->5
題目會給我們兩條已經從小到大排序好的串列,要求我們依照從小到大的順序,合併這兩條串列。
你可能也想看
Google News 追蹤
Thumbnail
該來的終究還是來了 度過焦躁不安的一整周,學徒老人家我的不安感等比級數的襲來,自3/19寫了第一篇關於<巴克萊銀行:倉促撤退>的報告,看到市場上的機構法人有如大洪水、地震來臨前夕開始竄逃撤退。 海湖莊園協議 接著,在3/31與4/2兩天接著寫了川普與他的財經團隊在海湖莊園豪
Thumbnail
空單爆天量、技術指標超賣、情緒恐慌到極致:美股嘎空行情有機會啟動嗎? 重點摘要: 技術面極度超賣,反彈條件醞釀中,但尚未明確止穩 SPY 與 QQQ 的重要指標,如MACD、KDJ、RSI等指標進入極端超賣區,但尚未出現底部鈍化或明確反轉訊號,技術面仍屬空方主導。 連續出現跳空缺口,空方動
Thumbnail
全新 vocus 挑戰活動「方格人氣王」來啦~四大挑戰任你選,留言 / 愛心 / 瀏覽數大 PK,還有新手專屬挑戰!無論你是 vocus 上活躍創作者或剛加入的新手,都有機會被更多人看見,獲得站上版位曝光&豐富獎勵!🏆
Thumbnail
有效的時間管理是提升生產力的關鍵。本文分享設計時間表的要素,包含考量生理時鐘、環境時鐘、正面心態以及加入彈性斜槓區塊,讓時間表更易執行且事半功倍。
Thumbnail
一、#用最小阻力原則, #達成健康永遠為先的目標。 健康與時間是不可逆的個人資源, 某項你投注時間的活動, 在看似平凡的日常,終將於未來發揮出 你無法想像的作用。 只要抱持著「#有做總比沒做好」的心理 ,就能安然度過 #拖延症的發作。 運動的好處不勝枚舉。 找個理由說服
    N年前我還在補教業當國文兼任作文教師的時候,很認真地研究順便和我的學生們討論,為什麼他們的作文寫不出來、寫不好、分數低。   甚至有人在作文內容寫「老師拜託不要給我低的分數我抄課文抄到快崩潰了」,沒有標點符號、掰不下去,但我看出了崩潰感。   我開始研究這點,並且在後來發現圖像(影
Thumbnail
題目敘述 題目會給定一個鏈結串列的起始點,要求我們把其中區間總和為0的部分刪除掉。 例如 1→ 2 → -2 → 3 → 4 裡面有一段是2 → -2 區間總和為零,所以簡化刪除後變成 1→ 3 → 4 題目的原文敘述 測試範例 Example 1: Input: head
Thumbnail
該來的終究還是來了 度過焦躁不安的一整周,學徒老人家我的不安感等比級數的襲來,自3/19寫了第一篇關於<巴克萊銀行:倉促撤退>的報告,看到市場上的機構法人有如大洪水、地震來臨前夕開始竄逃撤退。 海湖莊園協議 接著,在3/31與4/2兩天接著寫了川普與他的財經團隊在海湖莊園豪
Thumbnail
空單爆天量、技術指標超賣、情緒恐慌到極致:美股嘎空行情有機會啟動嗎? 重點摘要: 技術面極度超賣,反彈條件醞釀中,但尚未明確止穩 SPY 與 QQQ 的重要指標,如MACD、KDJ、RSI等指標進入極端超賣區,但尚未出現底部鈍化或明確反轉訊號,技術面仍屬空方主導。 連續出現跳空缺口,空方動
Thumbnail
全新 vocus 挑戰活動「方格人氣王」來啦~四大挑戰任你選,留言 / 愛心 / 瀏覽數大 PK,還有新手專屬挑戰!無論你是 vocus 上活躍創作者或剛加入的新手,都有機會被更多人看見,獲得站上版位曝光&豐富獎勵!🏆
Thumbnail
有效的時間管理是提升生產力的關鍵。本文分享設計時間表的要素,包含考量生理時鐘、環境時鐘、正面心態以及加入彈性斜槓區塊,讓時間表更易執行且事半功倍。
Thumbnail
一、#用最小阻力原則, #達成健康永遠為先的目標。 健康與時間是不可逆的個人資源, 某項你投注時間的活動, 在看似平凡的日常,終將於未來發揮出 你無法想像的作用。 只要抱持著「#有做總比沒做好」的心理 ,就能安然度過 #拖延症的發作。 運動的好處不勝枚舉。 找個理由說服
    N年前我還在補教業當國文兼任作文教師的時候,很認真地研究順便和我的學生們討論,為什麼他們的作文寫不出來、寫不好、分數低。   甚至有人在作文內容寫「老師拜託不要給我低的分數我抄課文抄到快崩潰了」,沒有標點符號、掰不下去,但我看出了崩潰感。   我開始研究這點,並且在後來發現圖像(影
Thumbnail
題目敘述 題目會給定一個鏈結串列的起始點,要求我們把其中區間總和為0的部分刪除掉。 例如 1→ 2 → -2 → 3 → 4 裡面有一段是2 → -2 區間總和為零,所以簡化刪除後變成 1→ 3 → 4 題目的原文敘述 測試範例 Example 1: Input: head