算法与数据结构(环形链表II)

题目

思路

这个题其实与之前环形链表的题差不多,这个麻烦的一点是需要你返回入环的第一个节点。

若我们继续用哈希表还是很简单,就是继续遍历链表,遇到的第一个重复的值即为入环的第一个节点。

这里我们看一下快慢指针的方法。

这里我们假设a为链表开头到入环第一个节点的距离。b为入环第一个节点到相遇点之间的距离,c为环剩下的距离。

我们让快慢指针都从链表开头部分开始移动,慢指针每次移一个距离,快指针每次移两个距离。

若相遇,则慢指针的移动距离为a+b,快指针移动的距离为a+n(b+c)+b。

快指针的移动距离是慢指针的2倍,由此可知a+n(b+c)+b=2(a+b)。

则a=(n-1)b+nc , a=(n-1)(b+c)+c。

所以a的距离就等于n-1圈的距离加上c。

若可以相遇,则将链表的开头定义为ptr,ptr和slow每次分别移动一格,当ptr将a走完的时候,一定会与slow在入环的第一个节点相遇,此时返回ptr即可。

代码

cpp 复制代码
class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode* fast=head,*slow=head;
        while(fast)
        {
            slow=slow->next;
            if(fast->next==nullptr) return nullptr;
            fast=fast->next->next;
            //若相遇
            if(fast==slow)
            {
                ListNode* ptr=head;
                while(ptr != slow)
                {
                    ptr=ptr->next;
                    slow=slow->next;
                }
                return ptr;
            }
        }
        return nullptr;
    }
};
相关推荐
AIoT科技物语9 分钟前
免费开源!50+算法,Java基于YOLO框架的视频AI识别算法平台,适配低空无人机巡检、摄像头安防场景
java·人工智能·算法·yolo·开源
ん贤10 分钟前
Go GC垃圾回收机制
算法·go·gc·垃圾回收
y = xⁿ19 分钟前
20天速通LeetCode day08:关于栈
算法·leetcode·职场和发展
Shadow(⊙o⊙)30 分钟前
专题二滑动窗口
数据结构·算法
tankeven38 分钟前
HJ181 相差不超过k的最多数
数据结构·c++·算法
XWalnut1 小时前
LeetCode刷题 day13
数据结构·算法·leetcode
小马_xiaoen1 小时前
前端虚拟列表(Virtual List)从原理到实战:海量数据渲染终极方案
前端·数据结构·list
炽烈小老头1 小时前
【每天学习一点算法 2026/04/17】多数元素
数据结构·学习·算法
云泽8082 小时前
第十五届蓝桥杯大赛软件赛省赛C/C++大学B组
c语言·c++·算法·蓝桥杯
大模型最新论文速读2 小时前
VQKV:KV Cache 压缩 82% 性能几乎不降
人工智能·深度学习·算法·机器学习·自然语言处理