题目描述
一个链表中包含环,请找出该链表的环的入口结点。
思路:
通过141题,我们知道可以通过快慢指针来判断是否有环,现在我们假设两个指针相遇在z点,如图
那么我们可以知道fast指针走过a+b+c+b
slow指针走过a+b
那么2*(a+b) = a+b+c+b
所以a = c
那么此时让slow回到起点,fast依然停在z,两个同时开始走,一次走一步
那么它们最终会相遇在y点,正是环的起始点
代码:
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
public class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead){
if(pHead==null|| pHead.next==null|| pHead.next.next==null) return null;
ListNode slow,fast;
slow=pHead.next;
fast=pHead.next.next;
while(slow!=fast) {
if(slow!=null&&fast!=null) {
slow=slow.next;
fast=fast.next.next;
}else {
return null;
}
}
for(slow=pHead;slow!=fast;slow=slow.next,fast=fast.next);
return slow;
}
}