Easy草稿★★★★★O(n) 時間 · O(1) 空間
Linked ListTwo Pointers
Patterns🐢 快慢指針↔️ 雙指針⛓️ 鏈結串列操作
尚未複習過

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

876Middle of the Linked ListLinked ListEasyLinked List

給定一個單向鏈結串列的頭節點 head,回傳鏈結串列的中間節點。若有兩個中間節點,回傳第二個。

Example:

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

Intuition

TIP

核心思路:快慢指針,快指針走兩步、慢指針走一步,快指針到底時慢指針剛好在中間。

Approaches

1. Two Pass (Count Length) — O(n) / O(1)
  • Idea: 第一次遍歷計算長度,第二次走到 length / 2 的位置
  • Time: O(n)
  • Space: O(1)
class Solution {
    fun middleNode(head: ListNode?): ListNode? {
        var length = 0
        var curr = head
        while (curr != null) {
            length++
            curr = curr.next
        }
        curr = head
        for (i in 0 until length / 2) {
            curr = curr?.next
        }
        return curr
    }
}
⭐ 2. Fast-Slow Pointer — O(n) / O(1)
  • Idea: 快指針走兩步、慢指針走一步,一次遍歷找到中間節點
  • Time: O(n)
  • Space: O(1)
class Solution {
    fun middleNode(head: ListNode?): ListNode? {
        var slow = head
        var fast = head
        while (fast?.next != null) {
            slow = slow?.next
            fast = fast.next?.next
        }
        return slow
    }
}

🔑 Takeaways