https://leetcode-cn.com/problems/linked-list-cycle-ii/
判断链表是否有环 可以使用快慢指针法, 分别定义 fast 和 slow指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环。 若链表没有环,那么fast指针一定会提前到尾端NULL处。
如果有环,如何找到这个环的入口 从相遇结点出发一个指针index1,从头结点也出发一个指针index2,这两个指针每次只走一个结点,那么这两个指针相遇的地方就是环形入口的结点。
证明如下: fast指针与slow指针相遇时,slow指针共走了x+y个结点,而fast指针走了x+n*(y+z)+y个结点。 又fast指针的步数是slow指针的两倍,故2*(x+y)=x+n*(y+z)+y 化简得: x=(n-1)(y+z)+z 当n=1时,x=z,index1走z步走到环形入口结点时,index2也走了z步,而z=x,故index2也走到了环形结点入口处。 当n=k时,x=(k-1)(y+z)+z,index1走(k-1)(y+z)+z步走到环形入口结点时,index2也走了(k-1)(y+z)+z步,而(k-1)(y+z)+z=x,故index2也走到了环形结点入口处。
证明完
|