算法之(二)判断一个单链表是否有环

转载 http://www.cnblogs.com/ghimtim/p/4882916.html

思路:如果一个单链表中有环,用一个指针去遍历,永远不会结束,所以可以用两个指针,一个指针一次走一步,另一个指针一次走两步,如果存在环,则这两个指针会在环内相遇,时间复杂度为O(n)。

拓展问题1:如果单链表有环,找出环的入口节点(环的连接点)。

这里先证明一个定理:碰撞点到连接点的距离=头指针到连接点的距离

假设单链表的总长度为L,头结点到环入口的距离为a,环入口到快慢指针相遇的结点距离为x,环的长度为r,慢指针总共走了s步,则快指针走了2s步。另外,快指针要追上慢指针的话快指针至少要在环里面转了一圈多(假设转了n圈加x的距离),得到以下关系:
s = a + x
2s = a + nr + x
=>a + x = nr
=>a = nr - x
设置一个头指针走了a,慢指针从相遇位置绕n圈回少一个x,则为第一个环入口节点
由上式可知:若在头结点和相遇结点分别设一指针,同步(单步)前进,则最后一定相遇在环入口结点。

猜你喜欢

转载自blog.csdn.net/u_hcy2000/article/details/83536572