力扣141. 环形链表

文章介绍了如何使用快慢指针法判断链表中是否存在环。通过设置一个慢指针每次移动一步,一个快指针每次移动两步,当快慢指针相遇则证明链表有环。讨论了不同步长下(如1步和2步,1步和3步)是否一定能相遇的情况,分析了相遇的条件。
摘要由CSDN通过智能技术生成

题目

给你一个链表的头节点head,判断链表中是否有环。如果链表中存在环,则返回true;否则,返回false。

链接:141. 环形链表 - 力扣(LeetCode)

题解

使用快慢指针法。定义一个慢指针slow和一个快指针fast,slow每次走一步,fast每次走两步,直到fast为空或者fast->next为空为止。如果链表中存在环,则在某一时刻fast一定会追上slow。所以在循环过程中,如果slow和fast相等则链表中存在环;如果直到循环结束slow和fast都不等则链表中不存在环。

代码如下:

bool hasCycle(struct ListNode* head) 
{
    struct ListNode* slow = head;
    struct ListNode* fast = head;
    while (fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;
        if (slow == fast)
            return true;
    }
    return false;
}

思考:为什么slow走1步,fast走2步时,slow和fast一定会相遇呢?如果slow走1步,fast走3步,slow和fast一定会相遇吗?

第一个问题,如果链表有环,slow走1步,fast走2步时,fast比slow先进环。假设当slow进环时,fast与slow的距离为N。slow进环后,fast开始追赶slow,slow每走1步、fast每走2步,slow和fast之间的距离减少1步。在整个追赶过程中,slow和fast之间的距离变化为:N、N-1、N-2、……3、2、1、0,所以slow和fast一定会相遇。

第二个问题,如果链表有环,slow走1步,fast走3步时,fast比slow先进环。假设当slow进环时,fast与slow的距离为N。slow进环后,fast开始追赶slow,slow每走1步、fast每走3步,fast和slow之间的距离减少2步。在整个追赶过程中,当N为偶数时,slow和fast之间的距离变化为:N、N-2、N-4、……4、2、0,slow和fast一定会相遇;当N为奇数时,fast和slow之间的距离变化为:N、N-2、N-4……3、1、-1,此时fast开始新一轮的追赶。假设环的长度为C,此时fast与slow的距离为C-1,如果C-1为偶数,slow和fast一定会相遇;如果C-1为奇数,slow和fast永远不会相遇。所以slow走1步,fast走3步时,slow和fast不一定会相遇。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值