【LeetCode] 2.Linkedリスト - リンクされたリストサイクルIIチェーンリング2

リンクリストを考えると、サイクルが始まるノードを返します。何のサイクルが存在しない場合は、返します  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。
    } 
}。

 

おすすめ

転載: www.cnblogs.com/hu-19941213/p/11242094.html