リンクリストを考えると、サイクルが始まるノードを返します。何のサイクルが存在しない場合は、返します null
。
与えられたリンクされたリスト内のサイクルを表すために、我々は整数使用 pos
尾部が接続するリンクされたリスト内(0インデックスの)位置を表します。場合 pos
で -1
は、リンクされたリストにはサイクルがありません。
注意:リンクリストを変更しないでください。
例1:
入力:ヘッド= [3,2,0、-4]、POS = 1つの
出力:尾はノードインデックス1に接続
説明:サイクルは、テールが第2ノードに接続されたリンクリスト、です。
例2:
入力:ヘッド= [1,2]、POS = 0
出力:尾インデックス0ノードに接続
説明:サイクルは尾が最初のノードに接続するリンクされたリストです。
例3:
入力:ヘッド= [1]、POS = -1
出力:なしサイクル
説明:リンクリストにはサイクルがありません。
フォローアップ:
あなたは余分なスペースを使用せずに、それを解決することはできますか?
リングの開始位置を決定し、我々は、2つの同期ポインタの長さを設定し、ステップ1の位相差は、遭遇ステップマネージャMの後、Mは、リングの長さです。私たちは、その後、両方のポインタの頭をリセットします。ポインタがM Pをステップを通じてバックトラバースするとき、前記ポインタPを位置決めするための、他を横断するためのqは、pは、サイクルの始まりです。
/ * * *単独リンクリストのための定義。 *構造体ListNode { * INTヴァル。 * ListNode *次の; * ListNode(INT X):ヴァル(x)は、次の(NULL){} *}。 * / クラスソリューション{ パブリック: ListNode * detectCycle(ListNode * ヘッド){ ListNode * P = ヘッド。 ListNode * Q = ヘッド。 int型のカウンタ= 0 ; 一方、(!p = NULL && P->次= NULL) { P = P->ネクスト> 次。 Q = Q->次; カウンタ ++ ; もし(P == Q){ P = ヘッド。 Q = ヘッド。 一方、(1 ) { ため(int型 I = 0 ; <Q = Q-; I ++はカウンタiが)> 次。 もし(P == Q)リターンP。 そうでなければ{ P = P-> 次。 Q = P。 } } } } 戻りNULL。 } }。