LeetCode 142.Linked List Cycle II を解いてみる
今回は、笹平が担当です。
LeetCodeというアルゴリズムが学べるサービスがあるので、その中の問題の一つを解いてみました。
ちなみに、linked listとは日本語で連結リストと呼ばれ、要素同士がそれぞれリンク情報をもっており、繋がっています。
問題
https://leetcode.com/problems/linked-list-cycle-ii/
日本語訳
リンクされたリストが与えられた場合、サイクルが始まるノードを返します。サイクルがない場合はnullを返します。
与えられたリンクリスト内のサイクルを表現するには、リンクリスト内の末尾が接続する位置(インデックス0)を表す整数posを使用します。posが-1の場合、リンク先リストにはサイクルはありません。
1 | /** |
簡単にコードの説明をします。
サイクルがあるかないかの判定に、リストを移動する二つの点を作ります。(ここではslow, fastという変数を用います)
名前の通りslowは遅く、fastは速く(slowの2倍の速度で)移動します。
もし、このfastがslowに追いついたらサイクルがあるということが言えます。
Aをスタート、Bをサイクルのはじまり、Cを二つの点が重なる地点としています。
1 | slow: x+y |
1 | 2(x+y) = x+y+z+y # fastはslowの2倍 |
つまり、xとzは同じ距離になることが分かります。
これを踏まえると、A,Cからスタートして、2つの点がぶつかるところがサイクルのスタートということになります。
簡単に説明しましたが、今回の記事はこれで以上です。
次の投稿もお楽しみに!