【快慢指针】个人练习-Leetcode-142. Linked List Cycle II

题目链接:https://leetcode.cn/problems/linked-list-cycle-ii/description/

题目大意:给一个链表的头部,判断链表是否有环,如果有,返回环的第一个指针;如果没有,返回nullptr

思路:简单的思路是并查集,第二次插入的那个指针就是环的起点。但这样空间复杂度还是 O ( N ) O(N) O(N)。使用快慢指针可以让空间复杂度降为 O ( 1 ) O(1) O(1)

快慢指针都从头部开始,slow每次走1步,fast每次走2步,如果链表有环,那么必然fast会追上slow。如果无环,某一次fast的下一步就是null

判断很好完成,那么如何找到入环的点呢?假设环外长度为 a a a,环起点到相遇点长度为 b b b,环剩下长度为 c c c,那么总环长为 b + c b+c b+c,总链表长为 a + b + c a+b+c a+b+c。

因为fast走过的路程为slow的两倍,假设fast走了 n n n圈,那么有
a + n ( b + c ) = 2 ( a + b ) a+n(b+c)=2(a+b) a+n(b+c)=2(a+b)

得出
a = ( n − 1 ) ( b + c ) + c a=(n-1)(b+c)+c a=(n−1)(b+c)+c

那么此时再让一个指针ptr从头开始,其走到环的起点的步数为 a a a,刚好就是slow指针把【当前环剩下的步数走完】并且【再走 n − 1 n-1 n−1圈环】的步数。因此它们一起走,一定会在环的起点相遇,这就找到环的起点了。

完整代码

cpp 复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode *fast = head, *slow = head;
        while (fast != nullptr) {
            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;
    }
};
相关推荐
啊董dong6 分钟前
noi-2026年5月12号小测验
数据结构·c++·算法
不知名的忻7 分钟前
红黑树(简易版)
算法·红黑树
NQBJT9 分钟前
万字拆解 NeckFix:AI 脖子前倾检测的算法原理与工程实现
人工智能·算法
jaychouchannel14 分钟前
Python 常用排序算法详解
算法
数智工坊15 分钟前
【Inner Monologue论文阅读】: 首次将大语言模型嵌入机器人控制闭环,实现自我反思和动态行为调整
论文阅读·人工智能·算法·语言模型·机器人·无人机
为何创造硅基生物1 小时前
C 语言 typedef 结构体私有化
c语言·开发语言·算法
yzx9910131 小时前
递归算法入门:像俄罗斯套娃一样思考
人工智能·算法
心中有国也有家1 小时前
从零上手 CANN 学习中心:像逛技术便利店一样学昇腾
学习·算法·开源
oo哦哦1 小时前
搜索矩阵系统的最短路密码:用Dijkstra算法和网络流理论,解释为什么你做了1000个关键词,流量还不如别人30个
网络·算法·矩阵
Matlab程序猿小助手1 小时前
【MATLAB源码-第319期】基于matlab的帝王蝶优化算法(MBO)无人机三维路径规划,输出做短路径图和适应度曲线.
开发语言·算法·matlab