エントリノード(安全offer_23を証明するために)、リストループ

タイトル説明


リンクリストを含む環は、エントリのリングノードリストを見つけます。要件は、余分なスペースを使用することはできません。

問題解決のためのアイデア


ダブルポインタ2つのノード各高速の速い動きに対するポインタは、各タイムモバイルノード遅いポインタを遅らせます。リングの存在なので、二つのポインタは、リング上のノードのいずれかで満たされなければなりません。

リングエントリノードは、ノードがZ1を満たしていることY1を、想定されます。

環N、X +はNy +(NY)のzの総経路長の周りの円に速い高速ポインタを仮定する。zは、ポインタが最後Z1ノードで満たされているので、バックアップを歩く必要はありません(N-1)倍の速度です。

X + Yの遅いと遅いポインタ総経路長。

二倍速いポインタが遅いポインタ、従ってX +のNy +(N-1)Z = 2(x + y)があるように。

X =(N-2)Y +(N-1)Z:我々は、リングエントリノードY1を探している、我々は最初に上記および関連するXに相当分解、長さxの値を探していると見ることができます。

上記等価強い法律ではなく、我々は+ zは環Yの合計の長さで見つけることができる、我々は、次に、上記の式壊れる:X =(N-2)、(Y + Z)+ Zを。

右のリングで(N-2)環を介している、ミーティングポイントから、次に長さZ1を介してZの長さであるが、この式の左側は、リングのY1入口ノードに開始点X1から長さです。この時点では、ミーティングポイントx1とZ1、距離による時間の初めから、二つのポインタを持っていると同時にあれば、最終的に彼らはリングのエントリノードに会うことがわかります。

公共ListNode EntryNodeOfLoop(ListNode PHEAD)
{ 
    場合(PHEAD == NULL || pHead.next == NULL 戻り ヌル
    ListNode遅い = PHEAD、速い= PHEAD。
    やる{ 
        速い = fast.next.next。
        遅い =はslow.next。
    } しばらく(遅い=!速いです)。
    速い = PHEAD。
    しばらく(!遅い= 速い)
    { 
        遅い = slow.next。
        速い = fast.next。 
    }
    返却が遅いです。
}

おすすめ

転載: www.cnblogs.com/ziytong/p/12123798.html