題目描述:對一個鏈結串列進行插入排序,回傳排序後的串列。
解題思路:插入排序的核心是維護一個「已排序」的前半段。對每個新節點,從已排序段的頭部開始掃描,找到正確的插入位置。在鏈結串列上實作時,使用虛擬頭節點(dummy node)簡化頭部插入的邊界情況。關鍵優化:若當前節點值大於等於已排序段的最後一個節點值,則無需插入,直接跳過。每次從 dummy 開始掃描是必要的,因為新節點可能需要插入到任意位置。此方法時間複雜度為 O(n²),適合小型或幾乎有序的串列。
時間複雜度:O(n²) — 對每個節點,最壞情況下需從頭掃描已排序段。
空間複雜度:O(1) — 原地操作,只使用常數個輔助指標。
1. Create dummy node with dummy.next = null
2. curr = head
3. While curr is not null:
a. Save next = curr.next
b. prev = dummy
c. While prev.next exists and prev.next.val < curr.val:
prev = prev.next
d. curr.next = prev.next
e. prev.next = curr
f. curr = next
4. Return dummy.next先轉為陣列再排序:將鏈結串列所有值存入陣列,排序後重建串列。時間 O(n log n),空間 O(n),但不符合插入排序的精神。
歸併排序:鏈結串列上的歸併排序時間 O(n log n)、空間 O(log n),是實務上更好的選擇,適合面試中討論為何插入排序不是最佳方案。