力扣142环形链表||

该算法利用快慢指针检测链表中是否存在环。当快慢指针相遇时,确定存在环,并从相遇点开始以相同速度移动一个指针,直至与头节点相遇,找到环的入口。关键在于相遇点与环入口的相对距离与环的关系。无论快指针速度为何,只要大于1,最终都会在环内与慢指针相遇。

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

struct ListNode *detectCycle(struct ListNode *head) {
    struct ListNode*fast=head;
    struct ListNode*slow=head;
    while(fast&&fast->next){
        fast=fast->next->next;
        slow=slow->next;
        if(fast==slow){
            struct ListNode*meet =slow;
            
    while(meet!=head){
    meet=meet->next;
    head=head->next;
}
      return meet;  }
        
        
    }
    return NULL;
}

 具体说说思路

  1.快慢指针和慢指针相交,我们可以设她两个相交点距离环入口距离为x,   从头到环入口距离为L

慢指针走的距离是L+X        

快指针则是L+X+nC(C是环长,也就是运动会中的扣圈)

然后快指针是慢指针速度的二倍,所以路程也会是二倍 所以L=nc-x=(n-1)c+x

2.那么从个相遇点开始另外来一个指针也就是meet,让meet和head一起走,head是走一个L,  meet是走c-x的距离,因为L=c-x+(n-1)c(c是圈哈)

所以meet会和head在环的入口相遇。

 

部分疑问

1. 快慢指针的速度问题,快指针一定是两个两个的吗?这时候想假如有环的话快慢指针早晚一定都会进去,当慢指针进去的时候,可以认为时间静止,慢指针不动,这时快指针的速度减一,也就是说在他们相遇之前,在环中最重要的是相对距离,快指针速度变为一后,会走遍整个环,也就是肯定会遇到慢指针,如果速度为3或4,大家可以自己想一想,可以在评论区和我沟通

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狗哥不是甜妹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值