↓快轉到主要內容
  1. LeetCode/

LeetCode 203: Remove Linked List Elements

·1 分鐘· ·
LeetCode Easy Linked-List Recursion
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: easy 第一次嘗試:2022-08-21

  • 提交紀錄:Time Limit Exceeded → Runtime Error ×2 → Wrong Answer ×2 → Time Limit Exceeded → Wrong Answer → Runtime Error → Time Limit Exceeded ×2 → Accepted ×3

解題思路
#

頭節點也可能等於 val,所以在前面接一個 dummy(Linked List 模板一)。之後只看 cur.next:要刪就跳過它,cur 不動(新的 cur.next 也可能要刪);不用刪才往前走。

我的嘗試
#

2022 年第一次寫這題花了 13 次提交,問題集中在三種:

  • TLE:第一版只在 if 裡移動 cur,不需要刪的時候不會前進,例如 [1]、val = 3 就無限迴圈。
  • RE / WA:檢查的是 cur.val,刪的卻是 cur.next。cur.next 是 None 時取 .next 報錯;就算不報錯,頭節點本身也永遠刪不掉,例如 [3]、val = 3 回傳 [3]。後來改成檢查 cur.next.val,又沒有處理頭節點和 cur.next 是 None 的情況。

加上 dummy、只看 cur.next 之後就 AC 了。

正確解法
#

class Solution:
    def removeElements(self, head: Optional[ListNode], val: int) -> Optional[ListNode]:
        dummy = ListNode(0, head)
        cur = dummy
        while cur.next:
            if cur.next.val == val:
                cur.next = cur.next.next
            else:
                cur = cur.next
        return dummy.next

複雜度
#

時間 O(n),空間 O(1)。

要特別避免的錯誤
#

  • 頭節點也可能要刪,用 dummy。
  • 刪除之後 cur 不要前進。

面試口說整理
#

我在前面接一個 dummy,只檢查 cur.next:等於 val 就跳過它、cur 不動,否則往前走。最後回傳 dummy.next。時間 O(n)。

相關文章

LeetCode 206: Reverse Linked List
·1 分鐘
LeetCode Easy Linked-List Recursion
LeetCode 206 解題筆記:prev / cur / nxt 三個指標,先記住下一個,再把 cur.next 指回 prev
LeetCode 141: Linked List Cycle
·1 分鐘
LeetCode Easy Hash-Table Linked-List Two-Pointers Floyds-Cycle-Finding-Algorithm
LeetCode 141 解題筆記:Floyd 判圈,快指針一次兩步、慢指針一次一步,有環就一定會相遇;兩個都要從自己的位置往前走
LeetCode 160: Intersection of Two Linked Lists
·1 分鐘
LeetCode Easy Hash-Table Linked-List Two-Pointers
LeetCode 160 解題筆記:兩個指標走完自己的串列就換走對方的,都走 lenA + lenB 步,會同時到達交點或同時到 None
LeetCode 83: Remove Duplicates from Sorted List
·1 分鐘
LeetCode Easy Linked-List
LeetCode 83 解題筆記:已排序,重複的一定相鄰;cur 跟 cur.next 一樣就跳過 cur.next,不一樣才前進
LeetCode 2: Add Two Numbers
·1 分鐘
LeetCode Medium Linked-List Math Recursion
LeetCode 2 解題筆記:位數是反著存的,從頭開始逐位相加帶進位;迴圈跑到兩條都走完而且沒有進位為止
LeetCode 171: Excel Sheet Column Number
·1 分鐘
LeetCode Easy Math String
LeetCode 171 解題筆記:從左到右 res = res × 26 + 字母的值(A = 1)