図に示すように、リンクリストの開始点はaで、リングのエントリポイントはbです。aから始まる2つの高速ポインタと低速ポインタを、一度に1つずつ、2つのノードに、一度に1つずつ設定します。交点がcであると仮定すると、最終的には確実に交配します。計算によれば、図の赤い線であるcからbまでの距離があり、長さはaからbに等しいので、別のポインターをaを指すように設定し、前に設定した低速ポインターをcから開始し、2人が一歩歩き、最後に会うポイントはリングの入り口であるbです。
public ListNode EntryNodeOfLoop(ListNode pHead) {
if (pHead == null||pHead.next == null) {
return null;
}
ListNode fast = pHead;
ListNode slow = pHead;
while (fast != null &&fast.next!=null) {
fast = fast.next.next;
slow = slow.next;
if (slow == fast) {
ListNode slow2 = pHead;
while (slow != slow2) {
slow = slow.next;
slow2 = slow2.next;
}
return slow;
}
}
return null;
}