力扣题目链接
思路:判断链表是否有环?可以使用快慢指针法,快指针每次走两步,慢指针每次走一步,如果链表有环一定会在环中相遇。
如何找环的入口?当快慢指针在环中第一次相遇时,让快指针从头结点出发,慢指针从相遇节点出发,每次都走一步,两指针再次相遇时即为环的入口。
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/ef25bd27bc5a433c84129c991d116459.png)
假设快慢指针相遇时,快指针只在环中走了一圈。当慢指针走到b点时,此时快指针走到c’点,由于快指针走的步数是慢指针的两倍,当慢指针走x步到b时,快指针就会走2*x步到c’,因此可得b-c’的长度为x。快慢指针会在c点相遇,显然c-b的长度也为x。因此如果慢指针从相遇点c出发,快指针从a点出发,两个指针每次都走一步,一定会在环形入口b点相遇的。
代码
public class Solution {
public ListNode detectCycle(ListNode head) {
ListNode fast= head, slow = head;
while (true) {
if (fast == null ||fast.next == null) return null;
fast = fast.next.next;
slow =slow.next;
if (fast == slow) break;
}
fast = head;
while (fast != slow) {
fast = fast.next;
slow = slow.next;
}
return fast;
}
}