核心思路:快慢指针+公式推导
起点到环入口点距离为a,两者相遇位置距离入口点为b,相遇点顺时针距离入口为c。
fast是slow路程的两倍
slow走了a+b
fast走了a+(b+c)k+b
化简可得:a=(k-1)(b+c)+c
这个式子的意思是: 链表头到环入口的距离=相遇点到环入口的距离+(k-1)圈环长度。其中k>=1,所以k-1>=0圈。所以两个指针分别从链表头和相遇点出发,最后一定相遇于环入口(现在已经在b点了,再走a,也就是(k-1)(b+c)+c,正好到入口点,正好相遇)。
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead) {
ListNode slow = pHead;
ListNode fast = pHead;
while(fast != null && fast.next != null){
fast = fast.next.next;
slow = slow.next;
if(fast == slow){
break;
}
}
if(fast == null || fast.next == null){
return null;
}
fast = pHead;
while(fast != slow){
fast = fast.next;
slow = slow.next;
}
return fast;
}
}