タイトル説明
リンクリストを含む環は、エントリのリングノードリストを見つけます。要件は、余分なスペースを使用することはできません。
問題解決のためのアイデア
ダブルポインタ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。 } 返却が遅いです。 }