leetcode:环形链表

题目

放一只一步走1格的乌龟和一只一步走2格的兔子到链表的入口. 如果链表不是环形的, 兔子会率先碰到null节点, 反之, 则兔子和乌龟必然会相遇. 设环入口前面的节点数是m, 环长是n, 则乌龟和兔子相遇于时间t, 当且仅当t>m且(2t+1-m)%n=(t+1-m)%n, 这等价于t>m且t%n=0. 也就是说, 自它们第一次相遇后, 任意相邻两次相遇的时间间隔即为n. 观测龟兔, 根据上述判断即可解决问题.

代码:

cpp 复制代码
class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        if(head==nullptr) return nullptr;
        ListNode * turtle=head;
        ListNode * rabbit=head;
        int n=0;
        while(true)
        {
            turtle = turtle->next;
            if(rabbit->next!=nullptr) rabbit = rabbit->next;
            else return nullptr;
            if(rabbit->next!=nullptr) rabbit = rabbit->next ; 
            else return nullptr;
            if(turtle==rabbit) break;
        }
        while(true)
        {
            turtle = turtle->next;
            rabbit = rabbit->next->next;
            n++;
            if(turtle==rabbit) break;
        }
        ListNode * turtle1=head;
        ListNode * turtle2=head;
        for(int i=0; ; i++)
        {
            turtle1=turtle1->next;
            if(i>=n) turtle2=turtle2->next;
            if(turtle1==turtle2) break;
        }
        return turtle1;
    }
};
相关推荐
资深web全栈开发2 小时前
LeetCode 3652: 按策略买卖股票的最佳时机
算法·leetcode·职场和发展
Wang ruoxi2 小时前
基于最小二乘法的离散数据拟合
人工智能·算法·机器学习
Xの哲學2 小时前
Linux链路聚合深度解析: 从概念到内核实现
linux·服务器·算法·架构·边缘计算
加成BUFF2 小时前
C++入门讲解3:数组与指针全面详解
开发语言·c++·算法·指针·数组
代码游侠2 小时前
应用——管道与文件描述符
linux·服务器·c语言·学习·算法
一招定胜负2 小时前
决策树开篇
算法·决策树·机器学习
GoWjw2 小时前
C语言高级特性
c语言·开发语言·算法
carver w2 小时前
说人话版 K-means 解析
算法·机器学习·kmeans
小O的算法实验室2 小时前
2026年SEVC SCI2区,基于差分向量内学习策略的自适应指数交叉差分进化算法,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进