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

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

83Remove Duplicates From Sorted ListLinked ListEasyLinked List

給定一個已排序的鏈結串列的頭節點 head,刪除所有重複的元素,使每個元素只出現一次,回傳排序後的鏈結串列。

Example:

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

Intuition

TIP

核心思路:因為已排序,重複元素必定相鄰,只需比對當前節點與下一個節點的值。

Approaches

1. Recursive — O(n) / O(n)
  • Idea: 遞迴處理,若當前節點與下一個節點值相同則跳過當前節點
  • Time: O(n)
  • Space: O(n) - 遞迴堆疊
class Solution {
    fun deleteDuplicates(head: ListNode?): ListNode? {
        if (head?.next == null) return head
        head.next = deleteDuplicates(head.next)
        return if (head.`val` == head.next?.`val`) head.next else head
    }
}
⭐ 2. Iterative — O(n) / O(1)
  • Idea: 遍歷鏈結串列,若 curr.val == curr.next.val 就跳過 next 節點
  • Time: O(n)
  • Space: O(1)
class Solution {
    fun deleteDuplicates(head: ListNode?): ListNode? {
        var curr = head
        while (curr?.next != null) {
            if (curr.`val` == curr.next!!.`val`) {
                curr.next = curr.next!!.next
            } else {
                curr = curr.next
            }
        }
        return head
    }
}

🔑 Takeaways