142. 环形链表 II

这篇博客探讨了如何利用快慢指针来检测和定位环形链表。通过设置一个快指针每次移动两步,慢指针移动一步,当它们相遇时确定链表存在环。接着,从头节点开始的新指针与相遇点同时移动,直至二者再次相遇,该位置即为环的入口。博客内容详细解释了这一算法的原理和实现步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

142.环形链表Ⅱ


 

        本题用快慢指针来做。需要判断俩个位置,一个是快慢指针何时相遇判断有环形链表,一个是环形链表的起点如何判断。

用一个快指针和一个慢指针,快指针一次移动两个节点,慢指针移动一个节点,如果二者相等,说明链表中有环形链表。

第二个问题比较复杂,最终结论是重新定义一个指针从头结点开始与相交的指针一起向后移动,直到二者相等时,这个位置就是环形链表的入口节点。

关键点是:

  1. 走a+nb步一定是在环入口
  2. 第一次相遇时慢指针已经走了nb步
  3. 参考: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;*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值