LeetCode-Linked List Cycle

本文介绍了一种使用快慢指针检测链表中是否存在环的高效算法。通过分析快慢指针相遇时的位置关系,得出从头节点出发与从相遇点出发的两个指针会在环的入口处再次相遇的结论。

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

寻找链表是否有环
方法是快慢指针

这里写图片描述

第一次相遇时slow走过的距离:a+b,fast走过的距离:a+b+c+b。
因为fast的速度是slow的两倍,所以fast走的距离是slow的两倍,有 2(a+b) = a+b+c+b,可以得到a=c

slow肯定没有走够超过一圈,在第一圈的中间停下来。假设直接就在圆上,则必定slow走一圈相遇,若前面还有一截,则不必等到一圈即可相遇。同时起步是最远的距离。

public class Solution {
    public ListNode detectCycle(ListNode head) {  
        ListNode slow = head;  
        ListNode fast = head;  
        while(fast != null && fast.next != null){  
            slow = slow.next;  
            fast = fast.next.next;  
            if(slow == fast)  
                break;  
        }  
        if(fast == null || fast.next == null)  
            return null;  
        slow = head;  
        while(slow != fast){  
            slow = slow.next;  
            fast = fast.next;  
        }  
        return fast;  
    }  

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值