×
Copy
Open
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
Remove duplicates from sorted list LinkedListから重複した要素を削除する
Slide 2
Slide 2 text
内容 ● 例を使って問題の確認 ● 考えられるコーナーケース ● 面接官に確認するべきこと ● 解法 ● 解法コード (Java) ● LeetCodeの解法を解説
Slide 3
Slide 3 text
例を使って問題の確認 重複が含まれる、すでにソートされた LinkedListが渡されます。
Slide 4
Slide 4 text
例を使って問題の確認 重複が含まれる、すでにソートされた LinkedListが渡されます。 渡されたLinkedListから重複した値を持 つノードを削除したLinkedListを返しま す。 この例の場合、1が重複しているのでその 余分なノードを削除します。
Slide 5
Slide 5 text
考えられるコーナーケース ノードが1つの場合
Slide 6
Slide 6 text
考えられるコーナーケース ノードが1つの場合 全て同じ値の場合
Slide 7
Slide 7 text
考えられるコーナーケース ノードが1つの場合 全て同じ値の場合 ループがある場合 (ソートされ てるとは言えないので、わたさ れないはずです)
Slide 8
Slide 8 text
考えられるコーナーケース ノードが1つの場合 全て同じ値の場合 ループがある場合 (ソートされ てるとは言えないので、わたさ れないはずです) nullの場合
Slide 9
Slide 9 text
面接官に確認するべきこと ● 与えられるLinkedListにループは含まれるか ● 与えられたLinkedListを変更してもいいのか、それとも新しいLinkedListを返すべき か ● LinkedListの値を比べる際、==で比べてもいいのか、それとも別の方法で重複を確 認するべきか 面接では意図的に条件をあやふやにしていることが多いです。曖昧な問題にどうアプ ローチするかを見ています。前提条件や求められる出力を確認して、その力があること を示しましょう。
Slide 10
Slide 10 text
その1: すべての要素を保存し、ソートして新しいLinkedListを作る => 計算量: O(N logN), 空間計算量: O(N) その2: ソート済み・重複なしの要素を保存し、新しいLinkedListを作る => 計算量: O(N), 空間計算量: O(N) その3: 与えられたLinkedListをそのまま変更していく => 計算量: O(N), 空間計算量: O(1) 解法
Slide 11
Slide 11 text
その1: すべての要素を保存し、ソートして新しいLinkedListを作る => 計算量: O(N logN), 空間計算量: O(N) その2: ソート済み・重複なしの要素を保存し、新しいLinkedListを作る => 計算量: O(N), 空間計算量: O(N) その3: 与えられたLinkedListをそのまま変更していく => 計算量: O(N), 空間計算量: O(1) 計算量、空間計算量で優れているその3を実装します 解法
Slide 12
Slide 12 text
与えられたLinkedListをそのまま変更していく => LinkedListを順番に見ていき、今までみた最大値を持つノードをキープします。最大 ノードと違う値がきたら、それが次のノードになるようにnextの値をアップデートします。 下のLinkedListを使います。 解法
Slide 13
Slide 13 text
今まで見たなかでの最大値ノードをmax, 今見ているノードをcurrとします。 最初はどちらも1番目のノードです。 解法
Slide 14
Slide 14 text
maxはそのままで、currが次のノードへ移動します。maxとcurrの値が同じなので何も起 きません。 解法
Slide 15
Slide 15 text
currが次のノードへ移動します。 解法
Slide 16
Slide 16 text
maxとcurrの値が違うのでmaxのポインタがアップデートされます。これで重複していた2 番目の1が、LinkedListから消えました。 2番目の1のポインタは変わってませんが、LinkedListの中に含まれないので問題ありま せん。 解法
Slide 17
Slide 17 text
最大値が2になったので、maxをアップデートします。 解法
Slide 18
Slide 18 text
currが次のノードへ移動します。 解法
Slide 19
Slide 19 text
maxとcurrの値が違うのでmaxのポインタがアップデートされます。ただ、この例ではアッ プデートされても変化がありません。 解法
Slide 20
Slide 20 text
最大値が3になったので、maxをアップデートします。 解法
Slide 21
Slide 21 text
currが次のノードへ移動します。nullとなり、LinkedListにある全ての要素を見終えまし た。 解法
Slide 22
Slide 22 text
最後にmax.nextをnullにします。なぜなら、maxが最後のノードになるからです。この例 では変化がありませんでした。 解法
Slide 23
Slide 23 text
最後にmax.nextをnullにします。なぜなら、maxが最後のノードになるからです。この例 では変化がありませんでした。 このステップが必要なのはmaxと同じ値のノードが続き、currが終わったときにmax.next がアップデートされないからです。下のLinkedListがそのケースです。 解法
Slide 24
Slide 24 text
解法 プログラムが終了すると、重複された要素がLinkedListから消えてるので、無事要件を 満たしました。
Slide 25
Slide 25 text
解法コード これをコードにすると右のようなコードになります。 https://harigami.jp/cmp_rs?hsh=c22f22fe-c8a6-44d5-802f-5baeaf666697 次にLeetCodeの解法についてです。 よりきれいな実装で問題を解いてます。
Slide 26
Slide 26 text
LeetCodeの解法を解説 https://leetcode.com/problems/remove-duplicates-from-sorted-list/solution/ currentとcurrent.nextが同じ値の場合、current.nextをスキップすることで、currentと同 じ値のノードをスキップし続ける実装になっています。 nullの場合分けもなく、whileループが終わったら全ての重複が取り除かれているため、 非常にきれいな実装です。
Slide 27
Slide 27 text
Thank you 作者: @koheiarai94