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

LeetCode 92: Reverse Linked List II

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

基本資料
#

難易度: medium 第一次嘗試:2022-11-26

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

解題思路
#

先用 dummy 走到第 left - 1 個節點 pre(left = 1 時就是 dummy)。cur = pre.next 是要反轉這段的第一個節點,它最後會變成這段的尾巴。之後重複 right - left 次:把 cur 後面那個節點拿出來,插到 pre 後面(Linked List 模板二)。

我的嘗試
#

前兩次 AC。之後重寫成「切成三段、反轉中間、再接回去」,但接回去時接的是原本這段的第一個節點 middle(反轉後它變成尾巴),應該接反轉後的頭 prev。例如 [8, 4]、left = 1、right = 2:答案 [4, 8],回傳 [8]。

正確解法
#

class Solution:
    def reverseBetween(self, head: Optional[ListNode], left: int, right: int) -> Optional[ListNode]:
        dummy = ListNode(0, head)
        pre = dummy
        for _ in range(left - 1):
            pre = pre.next
        cur = pre.next
        for _ in range(right - left):
            nxt = cur.next                           # 拿出 cur 後面那個
            cur.next = nxt.next
            nxt.next = pre.next                      # 插到 pre 後面
            pre.next = nxt
        return dummy.next

複雜度
#

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

要特別避免的錯誤
#

  • left = 1 時頭會換掉,所以從 dummy 出發。
  • cur 一直是同一個節點,只是越來越往後。

面試口說整理
#

我用 dummy 走到 left 的前一個節點,然後重複把這段裡的下一個節點搬到最前面,搬 right - left 次,這段就反轉了。只走一次,時間 O(n)。

相關文章

LeetCode 109: Convert Sorted List to Binary Search Tree
·1 分鐘
LeetCode Medium Linked-List Divide-and-Conquer Tree Binary-Search-Tree
LeetCode 109 解題筆記:快慢指針找中點當根,左右兩半遞迴建樹;高度自然平衡
LeetCode 116: Populating Next Right Pointers in Each Node
·1 分鐘
LeetCode Medium Linked-List Tree Depth-First-Search Breadth-First-Search
LeetCode 116 解題筆記:完美二元樹,用上一層已經接好的 next 走過這一層:left.next = right,right.next = next.left;O(1) 額外空間
LeetCode 148: Sort List
·1 分鐘
LeetCode Medium Linked-List Two-Pointers Divide-and-Conquer Sorting
LeetCode 148 解題筆記:用快慢指針切成兩半,遞迴排序後合併;O(n log n),不需要額外陣列
LeetCode 138: Copy List with Random Pointer
·1 分鐘
LeetCode Medium Hash-Table Linked-List
LeetCode 138 解題筆記:第一次走過建立舊節點到新節點的字典,第二次接上 next 和 random;字典裡先放 None -> None
LeetCode 143: Reorder List
·1 分鐘
LeetCode Medium Linked-List Two-Pointers Stack Recursion
LeetCode 143 解題筆記:找中點、反轉後半段、兩條交錯合併;前半段的尾巴要切斷
LeetCode 82: Remove Duplicates from Sorted List II
·1 分鐘
LeetCode Medium Linked-List Two-Pointers
LeetCode 82 解題筆記:重複的值要全部刪掉,頭也可能被刪,所以用 dummy;發現重複就一路跳到不同的值,再讓 prev.next 接過去