环链表寻找交点

03-08 1055阅读

目录

1.题目描述和出处

2.分析

3.代码


1.题目描述和出处

LCR 022. 环形链表 II - 力扣(LeetCode)

描述很简单,寻找交点,找到则返回交点,找不到返回空。


2.分析

如图:(b表示环的长度)

环链表寻找交点

本题要使用快慢指针的思想。

定义一个快指针f,一个慢指针s。快指针每次从头走两步,慢指针从头走一步。若存在环,则快指针一定能追上慢指针。

那么,现在让快慢指针第一次出发:

设f走了2L的距离,s走了L的距离(快指针每次从头走两步,慢指针从头走一步)。

当f和s相遇时:表示f套圈追上了s,假设套了n圈则有 2L - L = nb -> L = nb;

若从起点出发到达交点的距离可以用a+nb来表示,而s刚好走了nb的距离,也就是说再让s走a的距离就到达了交点,但是我们并不知道a的值。

我们第二次需要让快指针重新出发:

此时,我们让快指针回到起点并且每次直走一步和慢指针保持一致。

那么当他们第二次相遇的时候一定就是交点位置。

原因:当f走了a长度的路程时,这时b走的距离为nb+a。

我们有结论:a+nb表示达到交点,而n取0就是a。

也就是他们同时到达了交点,此时返回任意一个就是最终结果。


3.代码

ListNode *detectCycle(ListNode *head) {
        //快慢指针
        ListNode* f=head;
        ListNode* s=head;
        while(true)
        {
            //当快指针可以找到末尾时
            //表示没有环的存在
            if(f == nullptr || f->next == nullptr)
            return nullptr;
            //快指针走俩步 慢指针走一步
            f=f->next->next;
            s=s->next;
            if(f == s)
            break;
        }
        //从头开始重新找一遍,相遇的位置即为交点
        f=head;
        while(true)
        {
            if(f == s)
            break;
            f=f->next;
            s=s->next;
        }
        return f;
    }
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]