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

LeetCode 328: Odd Even Linked List

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

基本資料
#

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

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

解題思路
#

依位置(不是值)分成奇數位置和偶數位置兩條串列,保持原本的相對順序,最後把偶數串列接在奇數串列後面。

我的嘗試
#

一次通過。我用兩個 dummy head 分別收集,最後把偶數串列的尾巴設成 None(Linked List 模板一):

class Solution:
    def oddEvenList(self, head: Optional[ListNode]) -> Optional[ListNode]:
        odd_dummy, even_dummy = ListNode(), ListNode()
        o, e = odd_dummy, even_dummy
        curr, i = head, 1
        while curr:
            if i % 2:
                o.next = curr
                o = curr
            else:
                e.next = curr
                e = curr
            curr = curr.next
            i += 1
        e.next = None
        o.next = even_dummy.next
        return odd_dummy.next

正確解法:不用 dummy,兩個指標交錯前進
#

class Solution:
    def oddEvenList(self, head: Optional[ListNode]) -> Optional[ListNode]:
        if not head:
            return None
        odd, even = head, head.next
        even_head = even
        while even and even.next:
            odd.next = even.next
            odd = odd.next
            even.next = odd.next
            even = even.next
        odd.next = even_head
        return head

複雜度
#

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

要特別避免的錯誤
#

  • 偶數串列最後一個節點的 next 可能還指向原本的某個奇數節點,不斷開會變成環。
  • 分的是位置,不是節點的值。

面試口說整理
#

我把奇數位置和偶數位置的節點分別串成兩條串列,維持原本順序,最後奇數串列的尾巴接上偶數串列的頭,偶數串列的尾巴設成 None。只改指標,時間 O(n),空間 O(1)。

相關文章

LeetCode 146: LRU Cache
·2 分鐘
LeetCode Medium Hash-Table Linked-List Design Doubly-Linked-List
LeetCode 146 解題筆記:雜湊表找節點、雙向鏈結串列維護使用順序;get 和更新既有的 key 都要移到最前面
LeetCode 92: Reverse Linked List II
·1 分鐘
LeetCode Medium Linked-List
LeetCode 92 解題筆記:dummy 走到 left 的前一個節點,再把後面的節點一個一個搬到它後面,搬 right - left 次
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 117: Populating Next Right Pointers in Each Node II
·1 分鐘
LeetCode Medium Linked-List Tree Depth-First-Search Breadth-First-Search Binary-Tree
LeetCode 117 解題筆記:BFS 一層一層接 next;不是完全二元樹時,只看隔壁節點的小孩會斷掉
LeetCode 148: Sort List
·1 分鐘
LeetCode Medium Linked-List Two-Pointers Divide-and-Conquer Sorting
LeetCode 148 解題筆記:用快慢指針切成兩半,遞迴排序後合併;O(n log n),不需要額外陣列