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

LeetCode 19: Remove Nth Node From End of List

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

基本資料
#

難易度: medium 第一次嘗試:2022-10-20

  • 提交紀錄:Accepted → Runtime Error → Accepted ×2 → Runtime Error ×2 → Wrong Answer ×4 → Accepted → Runtime Error

解題思路
#

快指針先走,兩個指標之間保持固定的距離,快的走到底時慢的就在倒數第 n 個的前一個(Linked List 模板四)。從 dummy 出發,刪頭節點(n 等於長度)時也不用特判。

我的嘗試
#

第一次就 AC 了,但之後重寫時刪頭的情況一直出錯:沒有 dummy,所以要特判「快指針先走 n 步就到底」的情況,我試了 return []、ListNode([])、ListNode(None)、ListNode(0),都不是空串列。例如 [3]、n = 1:答案是空串列。加上 dummy 就不用特判了。

正確解法
#

class Solution:
    def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
        dummy = ListNode(0, head)
        fast = slow = dummy
        for _ in range(n + 1):
            fast = fast.next
        while fast:
            fast, slow = fast.next, slow.next
        slow.next = slow.next.next
        return dummy.next

複雜度
#

時間 O(n),空間 O(1),只走一次。

要特別避免的錯誤
#

  • 刪掉的是頭時,要回傳 None(空串列),不是 []、ListNode([]) 或 ListNode(0)。
  • 從 dummy 出發,就不用另外處理刪頭的情況。

面試口說整理
#

我從 dummy 出發,讓快指針先走 n + 1 步,再兩個一起走,快的走到 None 時慢的就在要刪的前一個,直接跳過它。只走一次,時間 O(n)。

相關文章

LeetCode 11: Container With Most Water
·1 分鐘
LeetCode Medium Array Two-Pointers Greedy
LeetCode 11 解題筆記:左右指針從兩端開始,每次移動比較矮的那一邊;移動高的那邊只會讓寬度變小、高度不會變高
LeetCode 15: 3Sum
·2 分鐘
LeetCode Medium Array Two-Pointers Sorting
LeetCode 15 解題筆記:排序後固定第一個數,剩下用對撞指針找兩數和;三個位置都要跳過相同的值,才不會有重複的組合
LeetCode 16: 3Sum Closest
·1 分鐘
LeetCode Medium Array Two-Pointers Sorting
LeetCode 16 解題筆記:排序後固定一個數,對撞指針找另外兩個;比較的是和跟 target 的距離 abs(sum - target)
LeetCode 18: 4Sum
·1 分鐘
LeetCode Medium Array Two-Pointers Sorting
LeetCode 18 解題筆記:排序後兩層迴圈固定前兩個數,剩下用對撞指針;四個位置都要跳過相同的值
LeetCode 5: Longest Palindromic Substring
·1 分鐘
LeetCode Medium Two-Pointers String Dynamic-Programming Manacher
LeetCode 5 解題筆記:中心擴展,每個位置當奇數和偶數長度的中心往外擴;區間 DP 的話 i 要從大到小
LeetCode 876: Middle of the Linked List
·1 分鐘
LeetCode Easy Linked-List Two-Pointers
LeetCode 876 解題筆記:快指針一次兩步、慢指針一次一步,快的走到底時慢的在中間;偶數長度時停在偏右的中點