0
点赞
收藏
分享

微信扫一扫

力扣142——环形链表||

白衣蓝剑冰魄 2022-02-03 阅读 72

题目描述
给定一个链表,如果有环路,找出环路的开始点。

输入输出样例
输入是一个链表,输出是链表的一个节点。如果没有环路,返回一个空指针。
在这里插入图片描述
*在这个样例中,值为 2 的节点即为环路的开始点。
LeetCode 采用如下的数据结构表示链表。
struct ListNode {
int val;
ListNode next;
ListNode(int x) : val(x), next(nullptr) {}
};

题解
对于链表找环路的问题,有一个通用的解法——快慢指针(Floyd 判圈法)。给定两个指针,
分别命名为 slow 和 fast,起始位置在链表的开头。每次 fast 前进两步,slow 前进一步。
如果 fast可以走到尽头,那么说明没有环路;
如果 fast 可以无限走下去,那么说明一定有环路,且一定存在一个时刻 slow 和fast 相遇

当 slow 和 fast 第一次相遇时,我们将 fast 重新移动到链表开头,
并让 slow 和 fast 每次都前进一步。当 slow 和 fast 第二次相遇时,相遇的节点即为环路的开始点。

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode *slow=head,*fast=head;
        do{
            if(!fast||!fast->next)
                return nullptr;
            fast=fast->next->next;
            slow=slow->next;
        }while(fast!=slow);
        fast=head;
        while(fast!=slow){
            slow=slow->next;
            fast=fast->next;
        }
        return fast;
    }
};

在这里插入图片描述

举报

相关推荐

0 条评论