LCR 021
题目:LCR 021
解法一:快慢指针
判断循环是否存在,一般用快慢指针算法解决。
fast
每次走两个单位,slow
每次走一个单位。当二者在环内相遇时,再创建一个指针 ptr
指向 head
,和 slow
同时走,每次走一个单位,slow
和 ptr
指针相遇位置,便是入环点
public ListNode detectCycle(ListNode head) {
ListNode slow = head, fast = head, ptr = head;
while (fast != null) {
slow = slow.next;
//空指针判断
if (fast.next == null) return null;
else fast = fast.next.next;
if (fast == slow) {
while (ptr != slow) {
ptr = ptr.next;
slow = slow.next;
}
return ptr;
}
}
return null;
}
}
注意:fast
每次走两个单位,当已经指向最后一个元素时,再连续走两个单位就会报空指针异常,因此fast
走两个单位时需要作空指针判断