链表找环的入口

本文介绍了如何检测链表是否存在环,并详细阐述了两种方法找到环的入口。首先,通过快慢指针判断链表有无环,当快慢指针相遇则存在环。接着,提供两种策略找到环的入口:一是从相遇点出发,慢指针继续移动,再次相遇点即为环入口;二是从头节点和相遇点同时单步移动,相遇处即为入口。文章还通过数学推导解释了这两种方法的原理,并给出了相关代码实现。

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

参考链接:https://blog.youkuaiyun.com/liushall/article/details/80444753

思想:先找是否有环:一快指针,一慢指针,相等即有环

找入口:

1.可在快慢指针重合的地方开始继续走慢指针,再次重合即环的长度n;一指针先走n步,另加一指针一起走,相等地方即入口

2.一指针指向头指针,一指针在重合的地方,一起单步走,相等地方即入口

解释:

2

 

头节点离环入口距离a,环长度为n

m1为慢指针走到入口,快指针所在位置:2a=(a+xn+b) -->a=xn+b

快指针离慢指针(n-b)距离,2倍速追上,需要(n-b)时间,即慢指针刚好走到m2点(重合点),m2离入口距离b,而上面的推导a=xn+b,所以再加一指针在头节点,慢指针在m2点,相同慢速走,会在入口相遇。

代码:

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    ListNode* EntryNodeOfLoop(ListNode* pHead)
    {
        if(pHead == NULL)return NULL;
        ListNode *fast=pHead,*slow=pHead;
        while(fast && fast->next)
        {
            
                fast=fast->next->next;
                slow=slow->next;
            
            if(fast == slow)
            {
                fast=pHead;
                while(fast != slow)
                {
                    fast=fast->next;
                    slow=slow->next;
                }
                return fast;
            }
        }
         return NULL;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值