给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
先找到相遇点 快的等于慢的时候就是相遇点 然后其中一个回到链表起点 以相同速度再次相遇时 就是入口
public class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead)
{
if(pHead==null||pHead.next==null||pHead.next.next==null)
return null;//至少三个以上的点才有环
ListNode fast = pHead,slow = pHead;
while (true) {//找到相遇点
if (fast == null || fast.next == null) {
return null;
}
slow = slow.next;
fast = fast.next.next;
if(fast == slow)
break;
}
fast=pHead;
while(fast!=slow){
fast=fast.next;
slow=slow.next;
}
return fast;
}
}
证明:
重点是求出起点到入口点的距离
https://blog.csdn.net/weixin_40807247/article/details/91447922