Leetcode142循環リンクリスト

問題非溶液多くはないループ・ポイントとの間の出会いの長さのクリアリング部分は、この数学的関係リングは、その部分の開始点理由と同じです。私は、彼らが同じである理由で、ここで追加する必要があります。
非環状部分の長さは、リングの合流点に開始点からの長さをy Xであると仮定する。ループの長さは、cです。
今、ゆっくりとポインタの長さは、高速ポインタが二回ポインタの遅い歩行速度などであることを行って、X + N1 * C + Yでなければなりません歩いて行きます。ポインタの長さは、高速ゴーゴー、この手段は2(X + N 1 * C +である Y)。

もう一つの制約は、ループの長さの整数倍でなければなりません遅く歩いて行ける距離を歩いて速くポインタのポインタのそれよりも行くことです。上記式によれば、2(X + N 1 * C + Y)-X + N1 * C + Y = X + N 1 * C + Y = N2 * Cを知ることができます。

だから、X + Y =(N2-N1がある )* cが、 これはどういう意味?我々は、この数式を解釈する:開始点までの長さ+非環式環部分は、ミーティングポイントとの間のリングの長さの整数倍です。データ構造内でこの意味は何でしょうか?私たちは今、その、出発点は、yのミーティングポイントであり、x + yは今、彼らはちょうどラップの多くを取るためのx距離ミーティングポイントから歩い意味リングの長さの整数倍で、2つのポインタが離れてリングからであることを知っています彼らは開始点までのx上のミーティングポイントから歩い場合ことを意味します。
X-ステップは、どのようにすることを歩いて?回答:レッツ離れミーティングポイントから、ヘッドから離れ、別のポインタをポインタを開始し、2つは、この時点で行くようにポインタを満たしていますので、Xリングステップの開始点です。

クラスのソリューション{
 パブリック
    ListNode * detectCycle(ListNode * ヘッド){
        ListNode *速い=頭部、*遅い= ヘッド。
        しばらく(速い!= NULL &&急速>次の!= NULL)
        {
           速い =急速>ネクスト> 次;
           減速 =遅い> 次の;
           もし(速い== 遅いです)
           {
               遅い = ヘッド。
               しばらく(遅い!= 速いです)
               {
                   減速 =遅い> 次の;
                   速い =急速> 次。
               }
               返却が遅いです。
           }
        }
        リターンNULL;
    }
}。

 

マップのキーの使用のみである鍵の最初の反復を見つけるためにリストをトラバースし、リングインポートノード

クラスのソリューション{
 パブリック
    ListNode * detectCycle(ListNode * ヘッド){
        マップ <ListNode *、int型 > 地図。
        ListNode * P = ヘッド。
        int型のインデックス= 0 ;
        しばらく(P!= NULL &&のp>次の!= NULL)
        {
            もし(Map.find(P)== Map.end())
            {
               Map.insert(make_pair(P、インデックス))。
               P = P - > 次。
               インデックス ++ ;
            }
              
            他の
                リターンのp;
        }
        リターンNULL;
    }
}。

 

おすすめ

転載: www.cnblogs.com/renzmin/p/11875888.html