给定一个链表的头节点 head
,返回链表开始入环的第一个节点。 如果链表无环,则返回 null
。
提示:
- 链表中节点的数目范围在范围
[0, 10^4]
内 -10^5 <= Node.val <= 10^5
解:假设非环形部分长度为 a ,环形部分长度为 b ,快指针的步长为f,慢指针的步长为s,且 。如果链表存在环,有
,这两个公式能够推导出
和
,我们再来看看如何到达入环的第一个节点?从起点开始走
步,或者走
步。能够看到,快指针和慢指针只需要再走
步就到了。如何确定
的长度呢?其实不需要确定,让快指针从head节点开始且步长改回1,他们两会同时到达入环的第一个节点的。
思路:Krahets
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode detectCycle(ListNode head) {
ListNode fast = head, slow = head;
while (fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
if (fast == slow) {
fast = head;
break;
}
}
// 这里fast指针有两种情况,就是链表如果没有环fast指针会是空指针,存在执行后续逻辑
if (fast == null || fast.next == null)
return null;
while (fast != slow) {
fast = fast.next;
slow = slow.next;
}
return fast;
}
}