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のように、オプショナルバインディングと条件式を並べて書けます。- 先頭ノードが削除されることはないため、先頭に置くダミーノードは不要です。
模範解答
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) 追加メモリ。