环形链表(快慢指针)

给你一个链表的头节点 head ,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递。仅仅是为了标识链表的实际情况。

如果链表中存在环 ,则返回 true 。 否则,返回 false

复制代码
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。
复制代码
输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。
复制代码
输入:head = [1], pos = -1
输出:false
解释:链表中没有环。

提示:

  • 链表中节点的数目范围是 [0, 104]
  • -105 <= Node.val <= 105
  • pos-1 或者链表中的一个 有效索引
cpp 复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 typedef struct ListNode LN;
bool hasCycle(struct ListNode *head) {
    LN* fast,* slow;
    fast=slow=head;
    while(fast && fast->next)
    {
        slow=slow->next;
        fast=fast->next->next;
        if(slow==fast)
        {
            return true;
        }
    }
    return false;

}

1.问:slow走一步fast走俩步一定能追上吗?

1答:

假设这个链表就是带环链表,如上图fast追slow,假设上图是距离是N那么,slow继续走一步fast走两步那么这里的距离就是N-1,以此类推N-2,N-3,N-4.....N最终就会是0所以fast一定能追上slow,换言之他们的速度差就一定可以追上

2.问:slow走1步fast走三步能追上吗?

假设这个链表就是带环链表,如上图fast追slow,假设上图是距离是N那么slow继续走一步fast走3步那么他们的速度差就是2这里就要分成俩种情况

N:奇数

N-2,N-4.....3...1...-1

也就是说fast永远在slow左右俩边反复横跳永远不能在一起

N:偶数

N-2,N-4.....4...2...0

当N为偶数的情况下他们最终都会相遇

相关推荐
玛卡巴卡ldf7 分钟前
【LeetCode 手撕算法】(矩阵)73-矩阵置零、54-螺旋矩阵(贪吃蛇)、48-旋转图像
java·数据结构·算法·leetcode·力扣
lcj251113 分钟前
蓝桥杯C++:数据结构(功能导向速查)
数据结构·c++·蓝桥杯
拾荒的路由35 分钟前
HOT100DAY9记录用
数据结构·算法·leetcode
寒月小酒1 小时前
3.26 OJ
数据结构·算法
宵时待雨2 小时前
C++笔记归纳15:红黑树
开发语言·数据结构·c++·笔记
罗湖老棍子2 小时前
【例 2】A Simple Problem with Integers(信息学奥赛一本通- P1548)
数据结构·算法·线段树·区间修改 区间查询
abant22 小时前
leetcode 148 排序链表 归并终极形态
算法·leetcode·链表
Yupureki2 小时前
《Linux系统编程》16.进程间通信-共享内存
linux·运维·服务器·c语言·数据结构·c++
Allen_LVyingbo2 小时前
自进化医疗智能体:动态记忆与持续运行的Python架构编程(上)
数据结构·python·架构·动态规划·健康医疗
代码探秘者2 小时前
【算法篇】5.链表
java·数据结构·人工智能·python·算法·spring·链表