题目描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
1.设置两个快慢指针,如果有环,快慢指针一定相遇
2.a点到b点跟b点到c点距离相同(a到b距离为a,b到c距离为b,c到b距离为c)
证明:
设快指针速度为两倍慢指针
对快指针相遇时走过距离为a+k(b+c)+b
慢指针 a+b
快指针走过的路程是慢指针的两倍所以
2*(a+b)=a+k(b+c)+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 fast=pHead;
ListNode slow=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;
while(pHead!=slow){
pHead=pHead.next;
slow=slow.next;
}
return pHead;
}
}