Medium草稿★★★★O(n) 時間 · O(1) 空間
Linked ListRecursion
Patterns⛓️ 鏈結串列操作
尚未複習過

解法已隱藏 — 先讀題目敘述、自己想想看,再點上方按鈕揭曉。

24Swap Nodes In PairsLinked ListMediumLinked List

給定一個鏈結串列,兩兩交換相鄰的節點,回傳交換後的頭節點。必須實際交換節點,不能只改值。

Example:

Input: head = [1,2,3,4] Output: [2,1,4,3]

Intuition

TIP

核心思路:每次處理兩個節點的交換,然後遞迴或迭代處理剩餘部分。

Approaches

1. Recursive — O(n) / O(n)
  • Idea: 交換前兩個節點,第一個節點的 next 指向遞迴處理後的結果
  • Time: O(n)
  • Space: O(n) - 遞迴堆疊
class Solution {
    fun swapPairs(head: ListNode?): ListNode? {
        if (head?.next == null) return head

        val first = head
        val second = head.next

        first.next = swapPairs(second?.next)
        second?.next = first

        return second
    }
}
⭐ 2. Iterative with Dummy Head — O(n) / O(1)
  • Idea: 使用 dummy 節點,每次取 prev 後面的兩個節點交換,然後移動 prev
  • Time: O(n)
  • Space: O(1)
class Solution {
    fun swapPairs(head: ListNode?): ListNode? {
        val dummy = ListNode(0)
        dummy.next = head
        var prev: ListNode? = dummy

        while (prev?.next != null && prev.next?.next != null) {
            val first = prev.next!!
            val second = first.next!!

            // 交換
            first.next = second.next
            second.next = first
            prev.next = second

            // 移動 prev 到下一對的前面
            prev = first
        }

        return dummy.next
    }
}

🔑 Takeaways