有环单链表,找环的入口。

先说结论:常用二指针找环的方法,两倍速,则相遇点到环入口的距离和链表头结点到链表环入口的距离相等。

 

 

如何判断环的入口点:碰撞点p到连接点的距离=头指针到连接点的距离,因此,分别从碰撞点、头指针开始走,相遇的那个点就是连接点。

为什么呢?需要一个简单的计算过程:
(1)当fast与slow相遇时,show肯定没有走完链表,而fast已经在还里走了n(n>= 1)圈。假设slow走了s步,那么fast走了2s步。fast的步数还等于s走的加上环里转的n圈,所以有:
2s = s + nr。因此,s = nr。
(2)设整个链表长为L,入口据相遇点X,起点到入口的距离为a。因为slow指针并没有走完一圈,所以:
a + x = s,带入第一步的结果,有:a + x = nr = (n-1)r + r = (n-1)r + L - a;即:
a = (n-1)r + L -a -x;
这说明:从头结点到入口的距离,等于转了(n-1)圈以后,相遇点到入口的距离。因此,我们可以在链表头、相遇点各设一个指针,每次各走一步,两个指针必定相遇,且相遇第一点为环入口点。

 

 1 综上:你需要知道这几个关系:
 2 
 3 s = 2s
 4 
 5 s = a + x
 6 
 7 2s = s + nr
 8 
 9 r = L - a
10 
11 要解这个:L - a - x 

 

posted @ 2017-11-14 11:26  澄轶  阅读(493)  评论(0编辑  收藏  举报