题目
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
思路
首先 有环的链表长这样
如果存在环 那么因为fast 和slow 速度不一样 他们总会相遇
fast 和slow 在Z1相遇
那么 fast 走过的路长度 = x+ny+(n-1)z
slow 走过的长度 = x+y
因为fast 是每次移动两个节点 所以 2(x+y) = x+ny+(n-1)z
但我们需要找的是环的入口结点y1 我们需要知道x的长度
化简一下 为 x = (n-2)y+(n-1)z = (n-1)(y+z) +z
有图可知 环的长度为y+z
也就是说如果此时再定义一个指针slow2 指向头结点
他们相遇时
slow转了n圈,又走了z长
slow2刚好指向环的入口结点
注意特值 没找到返回null
代码
public class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead)
{
if ( pHead == null || pHead.next == null)
return null;
ListNode fast = pHead;
ListNode slow = pHead;
ListNode slow2 = pHead;
while(fast != null && fast.next != null){//这一步是保证链表有环 因为fast快
//如果没有环 可以更早发现 所以要用fast
fast = fast.next.next;
slow = slow.next;
if(fast == slow){
while(slow2 != slow){
slow =slow.next;
slow2 =slow2.next;
}
return slow;
}
}
return null;
}
}