码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-11-14 14:45:04      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:div   关系   如何   头结点   计算过程   说明   距离   判断   结果   

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

 

 

如何判断环的入口点:碰撞点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 

 

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

标签:div   关系   如何   头结点   计算过程   说明   距离   判断   结果   

原文地址:http://www.cnblogs.com/suanec/p/7831610.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!