基础算法(二)找出单向链表中环的入口

基础算法(二)找出单向链表中环的入口

在这里插入图片描述
这里假设:
a是头结点到环的入口的距离
b是环入口到相遇结点的距离
c是整个环的长度

一般来说,两个指针相遇的时候,慢指针还没走完一圈,但此时快指针已经走完一圈多了。

计算快慢指针所走过的距离:
dis(fast) = a + b +c
dis(slow) = a + b

又已知 快指针 比 慢指针 快两倍,因此快指针走过的路程为慢指针的两倍。

dis(fast) = dis(slow)*2 
化简后得:
a = c - b

用环的长度 减去 慢指针走过的距离,就是头结点到环入口的距离了。

这意味着在第一次相遇后,将快指针重新从开始,每次一步,下次快慢指针再相遇就是环入口处了。

以下为实现的代码:

struct ListNode* detectCycle(struct ListNode* head ) {
    // write code here
    if(head == NULL)
    {
        return NULL;
    }
    else
    {
        struct ListNode*fast = head;
        struct ListNode*slow = head;
        //先判断是否有环链表,如果不是就返回NULL
        while(fast != NULL && fast->next != NULL)
        {
            fast = fast->next->next;
            slow = slow->next;
            if(slow == fast)//如果快慢指针能相遇证明是有环链表
            {
                fast = head; //让 快指针 回到头结点
                while(fast != slow)
                {  //俩个指针继续一步一步往前走,直到相遇
                    fast = fast->next;
                    slow = slow->next;
                }
                return fast; //把环的入口返回出去
            }
        }
        return NULL;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大白菜wu

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

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

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

打赏作者

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

抵扣说明:

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

余额充值