分析:在此题中,我们定义两个ListNode 变量,分别为fast ,slow 。其中fast 每次向前走走两步,slow 每次向前走一步,这样如果链表中有环的时候fast 和slow 必定会在环中的某一个节点相遇。否则链表中没有环。现在假设链表中环的元素个数是n个,fast 和slow相遇在k节点上,进入环入口前链表元素一共有a个元素。假设slow 在进入环入口前,fast已经走了m圈。所以有2(a+k)=a+m*n+k其中(m为整数,fast 是slow 的两倍),于是就得到了a=m*n-k;所以我们定义一个新的节点 node让他指向链表的头结点,与此同时让node与slow一同向前一步一步的走,当他们两个相等的时候即是链表的环入口
public class Solution{
public ListNode EntryNodeOfLoop(ListNode pHead)
{
ListNode p_node=null;
if(pHead ==null || pHead.next==null){
return null;
}
ListNode fast = pHead;
ListNode slow = pHead;
while(fast !=null && fast.next != null ){
//每次向前走两步
fast=fast.next.next;
//每次向前走一步
slow=slow.next;
if(slow == fast){
//slow与fast相遇的时候
ListNode node=pHead;
while(node !=slow){
node=node.next;
slow=slow.next;
}
return node;
}
}
return null;
}
}