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

LeetCode 25: Reverse Nodes in k-Group

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

基本資料
#

難易度: hard 第一次嘗試:2026-11-01

  • 提交紀錄:Accepted(一次通過)

解題思路
#

先數串列長度,n // k 就是要翻的組數,最後不滿 k 個的不翻。

用 dummy head(Linked List 模板一),curr 指向「上一組的尾巴」:

  1. 把 curr.next 開始的 k 個節點反轉(模板二)。反轉後,原本這組的頭變成尾巴。
  2. curr.next 接到反轉後的新頭,新尾巴接到下一組的開頭。
  3. curr 移到這組的新尾巴,處理下一組。

我的嘗試
#

一次通過。

正確解法
#

class Solution:
    def reverseKGroup(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
        n = 0
        node = head
        while node:
            n += 1
            node = node.next

        dummy = ListNode(0, head)
        curr = dummy
        for _ in range(n // k):
            group_head = curr.next
            prev, node = None, group_head
            for _ in range(k):
                nxt = node.next
                node.next = prev
                prev = node
                node = nxt
            curr.next = prev            # 這組的新頭
            group_head.next = node      # 新尾巴接到下一組
            curr = group_head
        return dummy.next

我當時把反轉寫成一個回傳 (新頭, 新尾, 下一組開頭) 的 helper,意思一樣。

複雜度
#

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

要特別避免的錯誤
#

  • 最後不滿 k 個不能翻,先數長度最簡單;也可以每組先往前探 k 步確認夠長。
  • 反轉後原本的頭變成尾,要記住它,下一組才接得上。
  • 用 dummy head,第一組才不用特別處理新的 head。

面試口說整理
#

我先數長度,知道要翻幾組。用 dummy head,curr 指向上一組的尾巴,每次把後面 k 個節點反轉,再把上一組的尾接到新頭、這組原本的頭(現在是尾)接到下一組,然後 curr 移到這組的尾。時間 O(n),空間 O(1)。

相關文章

LeetCode 460: LFU Cache
·2 分鐘
LeetCode Hard Hash-Table Linked-List Design Doubly-Linked-List
LeetCode 460 解題筆記:key → 節點、freq → 雙向鏈結串列,再記一個 min_freq;同頻率裡用 LRU 決定淘汰誰
LeetCode 23: Merge k Sorted Lists
·3 分鐘
LeetCode Hard Linked-List Heap Merge-Sort Divide-and-Conquer
LeetCode 23 解題筆記:heap 只放 k 個開頭,以及分治兩兩合併
LeetCode 60: Permutation Sequence
·1 分鐘
LeetCode Hard Math Combinatorics Recursion
LeetCode 60 解題筆記:k 改成 0-indexed,第一位決定之後剩下 (n-1)! 種排法;k // (n-1)! 就是第一位在剩下的數字裡排第幾,取出後繼續處理下一位
LeetCode 143: Reorder List
·1 分鐘
LeetCode Medium Linked-List Two-Pointers Stack Recursion
LeetCode 143 解題筆記:找中點、反轉後半段、兩條交錯合併;前半段的尾巴要切斷
LeetCode 24: Swap Nodes in Pairs
·1 分鐘
LeetCode Medium Linked-List Recursion
LeetCode 24 解題筆記:dummy 加上兩兩一組,prev.next、a.next、b.next 三個指標一起重接;交換的是節點不是值
LeetCode 234: Palindrome Linked List
·1 分鐘
LeetCode Easy Linked-List Two-Pointers Stack Recursion
LeetCode 234 解題筆記:快慢指針找中點,反轉後半段,再從兩端往中間比;O(1) 額外空間