在单向链表中找环也是有多种办法,不过快慢双指针方法是其中最为简洁的方法之一,接下来介绍这种方法。
首先两个指针都指向链表的头部,令一个指针一次走一步,另一个指针一次走两步,如果它们相遇了,证明有环,否则无环,时间复杂度 。
如果有环的话,怎么找到环的起点呢?
我们列出式子来观察一下,设相遇时,慢指针一共走了 步,在环上走了 步(快慢指针在环上相遇时,慢指针一定没走完一圈)。快指针走了 步,设环长为 ,则有
第一次相遇时 取最小正整数 1。也就是说 。那么利用这个等式,可以在两个指针相遇后,将其中一个指针移到表头,让两者都一步一步走,再度相遇的位置即为环的起点。