链表中环的问题
问题描述:
给你一个链表的表头指针head,如何判断链表中是否有环?
扩展问题:如果有环,请找出环的入口点。
问题解答:
- 对于第一个问题,有一个很普遍的作法,就是使用快慢指针,一个指针一次走一步,另一个指针一次走两步,看是否相遇,便可以很容易得到结果。细节不再赘述。
- 需要仔细分析的是第二个问题,如下图所示
假设我们的链表形状是途中所示,那么可以看出块慢指针在节点3处相遇,我们假设1到2之间的距离是x, 2到3之间的距离是y, 3到2之间的距离是z,那么我们根据快指针每次走两步的特性可以得出下列公式:
2*(x + y) = x + y + k*(y + z) 其中k为1 , 2……
由上面公式我们又可以推到出 x = k(y + z) - y = (k - 1)*(y + z) + z;
即:x = (k - 1)*(y + z) + z;
所以,后面找入口的办法是在起点(节点1)和相遇点(节点3)分别设置一个指针,然后二者每次往前一同移动一步,他们一定会在入口(节点2)处相遇。OK搞定。