如图,链表起点为a,环的入口点为b,设两个快慢指针从a开始,一个一次走两个节点,一个一次走一个,那么最终他们肯定会相遇的,假设相遇点为c,那么根据推算,有c到b的距离即图中红线部分,长度等于a到b,所以我们再设一个指针指向a,让之前设置的慢指针接着c开始,两个一人走一步,那么最终相遇的点就是环的入口即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;
}