Swift教室 Swift と競技プログラミングの教室

03. Remove Duplicates from Sorted List

読了目安 約1分

Linked List / LeetCode 83 (Easy) — ソート済み連結リストの重複ノードを取り除き、各値を 1 回だけ残す。

この章の目次

問題

LeetCode 83. Remove Duplicates from Sorted List(Easy / カテゴリ: Linked List)

値が昇順に並んだ連結リストの先頭 head が与えられます。 重複するノードを取り除き、各値が 1 回だけ現れるようにしたリストを返してください。

考え方

ヒント 1

ソート済みなので、同じ値のノードは必ず隣り合っています。 各ノードで「次のノードが同じ値かどうか」を見るだけで、重複を判定できます。

ヒント 2

次のノードが同じ値なら、n.next = n.next?.next で次のノードをリストから外します。 値が変わったときだけ、注目するノードを 1 つ進めます。

Swift 実装のポイント

  • ノードの削除は参照の付け替えです。n.next を 1 つ先に差し替えれば、間のノードはリストから外れます。
  • while let next = n.next, next.val == n.val のように、オプショナルバインディングと条件式を並べて書けます。
  • 先頭ノードが削除されることはないため、先頭に置くダミーノードは不要です。
模範解答
Swift
class Solution {
    func deleteDuplicates(_ head: ListNode?) -> ListNode? {
        var node = head
        while let n = node {
            while let next = n.next, next.val == n.val {
                n.next = next.next
            }
            node = n.next
        }
        return head
    }
}

計算量: O(n) 時間、O(1) 追加メモリ。