环形链表(快慢指针)

给你一个链表的头节点 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为偶数的情况下他们最终都会相遇

相关推荐
qiqsevenqiqiqiqi17 分钟前
MT2048三连 暴力→数学推导→O (n) 优化
数据结构·c++·算法
码之气三段.23 分钟前
十五届山东ccpc省赛补题(update)
数据结构·c++·算法
保持清醒5402 小时前
二叉链表实现
数据结构
paeamecium2 小时前
【PAT甲级真题】- Recover the Smallest Number (30)
数据结构·算法·pat考试·pat
玛丽莲茼蒿2 小时前
Leetcode hot100 在排序数组中查找元素的第一个和最后一个位置【中等】
数据结构·算法
踩坑记录3 小时前
leetcode 92. 反转链表 II 区间反转(不是整条链表反转)
leetcode·链表
寒秋花开曾相惜3 小时前
(学习笔记)4.2 逻辑设计和硬件控制语言HCL(4.2.3 字级的组合电路和HCL整数表达式)
android·网络·数据结构·笔记·学习
发疯幼稚鬼3 小时前
二叉树的广度优先遍历
c语言·数据结构·算法·宽度优先
love在水一方3 小时前
【Voxel-SLAM】Data Structures / 数据结构文档(二)
数据结构·人工智能·机器学习
Via_Neo3 小时前
乘积最大问题
数据结构·算法