1、先判断是否有环
**思路:**用快慢两个指针分别从链表头开始,慢指针 -> next,快指针 -> next -> next,这样如果有环那快指针务必会跑到慢指针后面,随即两者之间的距离一次会缩小一步,最终相遇。若是未相遇且快指针的 next 为 null,则说明链表无环。
2、若是有环怎么找到环入口
链表中有闭环即快慢两指针相遇了
当两指针在 P 点相遇,我们可列出如下等式:
2(L+x) = L+x+n*H (n >= 1) // n 为快指针在闭环上的圈数
=> 2L+2x = L+x+n*H (n >= 1)
=> L = n*H-x (n >= 1)
=> L = (n-1)*H+(H-x) (n >= 1)
思路: 当 l1 与 l2 相遇时,再来一个 l3 指针从链表头开始,而 l1 继续走,l2 就可以终结其使命没必要继续走了。此时 l1 和 l3 指针都是指向其 next。当 l3 指针到达环入口时,l1 也必然到达了环入口,即 l1 和 l3 指针会在环入口相遇,从而可求得入口位置。