题目
一个链表中包含环,请找出该链表的环的入口结点。
思路1
用容器ArrayList保存每个走过的节点,遇到重复的即返回
思路2
断环法,不留后路,断开每一个走过节点的指向,最后一个节点指向空
思路3
设置一快一慢两个指针,fast速度为slow的2倍,第一次相遇,fast路程为slow路程2倍,列等式
x:环外路程 c:环路程 a:环中相遇时走过的路程
fast = x+mc+a;
slow = x+nc+a;
解得x = (m-2n-1)c+c-a
c-a环中相遇时为]未走过的路程
再设一指针为开始节点,再次相遇时即为入口
public class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead)
{
if(pHead==null||pHead.next==null)
return null;
ListNode fast = pHead;
ListNode slow = pHead;
while(fast!=null){
fast = fast.next.next;
slow = slow.next;
if(fast==slow)
break;
}
if(fast==null)
return null;
fast = pHead;
while(fast!=slow){
fast = fast.next;
slow = slow.next;
}
return fast;
}
}