
本题用快慢指针来做。需要判断俩个位置,一个是快慢指针何时相遇判断有环形链表,一个是环形链表的起点如何判断。
用一个快指针和一个慢指针,快指针一次移动两个节点,慢指针移动一个节点,如果二者相等,说明链表中有环形链表。
第二个问题比较复杂,最终结论是重新定义一个指针从头结点开始与相交的指针一起向后移动,直到二者相等时,这个位置就是环形链表的入口节点。
关键点是:
- 走a+nb步一定是在环入口
- 第一次相遇时慢指针已经走了nb步
- 参考: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;
ListNode slow = head;
while (true) {
if (fast == null || fast.next == null) {return null;}
slow = slow.next;
fast = fast.next.next;
if (fast == slow) break;
}
slow = head;
while (fast != slow) {
slow = slow.next;
fast = fast.next;
}
return fast;
}
}
//下方的注释代码是原代码,我的while循环条件是快指针与慢指针相等,
//答案的条件是死循环,当快慢指针相等的时候跳出循环。我的结果是最终答案标记在正确答案前一个。
/* while (fast != slow) {
if (fast == null || fast.next == null) return null;
fast = fast.next.next;
slow = slow.next;
}
ListNode cur = fast;
slow = head;
while (cur != slow) {
slow = slow.next;
cur = cur.next;
}
return fast;*/
这篇博客探讨了如何利用快慢指针来检测和定位环形链表。通过设置一个快指针每次移动两步,慢指针移动一步,当它们相遇时确定链表存在环。接着,从头节点开始的新指针与相遇点同时移动,直至二者再次相遇,该位置即为环的入口。博客内容详细解释了这一算法的原理和实现步骤。
1736

被折叠的 条评论
为什么被折叠?



