🤖

141. Linked List Cycle

に公開

リンクリストの先頭ノード head が与えられたとき、そのリンクリストにサイクル(循環)があるかどうかを判断してください。

リンクリストにサイクルがあるとは、次のポインタを連続してたどることで、再び同じノードに戻ることができる場合を指します。内部的に、pos は尾ノード(最後のノード)の next ポインタが接続されているノードのインデックスを表すために使用されます。なお、pos はパラメータとして渡されません。

リンクリストにサイクルがある場合は true を返し、ない場合は false を返してください。


入出力例

例1:

入力: head = [3,2,0,-4], pos = 1  
出力: true  
説明: リンクリストにはサイクルがあり、尾が1番目のノード(0インデックス)に接続されています。

例2:

入力: head = [1,2], pos = 0  
出力: true  
説明: リンクリストにはサイクルがあり、尾が0番目のノードに接続されています。

例3:

入力: head = [1], pos = -1  
出力: false  
説明: リンクリストにはサイクルがありません。

制約条件

  • リスト中のノード数は [0, 10^4] の範囲です。
  • 各ノードの値は -10^5 <= Node.val <= 10^5 の範囲です。
  • pos-1 またはリンクリスト内の有効なインデックスです。

フォローアップ

この問題を O(1) (定数)メモリで解決できますか?

フロイドのサイクル検出アルゴリズム(2ポインタ法:速いポインタと遅いポインタ)

  • 速いポインタ(fast) は2ステップずつ進み、遅いポインタ(slow) は1ステップずつ進む。
  • サイクルが存在する場合、速いポインタと遅いポインタは必ずどこかで交差します。
  • サイクルが存在しない場合、速いポインタが None に到達して終了します。
  • このアルゴリズムは、O(1) のメモリを使用し、O(n) の時間計算量で解決できます。

Discussion