思路:用p1、p2分别遍历链表head,p1每次走一步,p2每次走两步,若有环最终他们会在某一点相遇,此时将p2从头开始遍历链表,这一次他们相遇的结点就是环的入口
证明:
设入口为join,他们第一次在pos相遇,join到pos的距离为x,环的大小为R,则第一次相遇时有:
p1走过的距离为:S=lenA+x+mR
p2走过的距离为:2S=lenA+x+nR
可得:lenA=(n-2m)R-x
所以LenA的长度为从pos开始走n-2m圈,再回退x步,也就是jion结点
static Node solve(Node head)
{
Node p1=head;
Node p2=head;
while(p1!=null && p2!=null && p2.next!=null)
{
p1=p1.next;
p2=p2.next.next;
if(p1==p2)
{
p2=head;
while(p1!=p2)
{
p1=p1.next;
p2=p2.next;
}
return p1;//入口结点
}
}
return null;//返回null则没有环
}