当前位置: 首页 > article >正文

环形链表问题——力扣141,142

环形链表问题——力扣141,142

  • 141.判断链表是否带环
  • 142.给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 NULL

141.判断链表是否带环

在这里插入图片描述

  1. 这道题不能用比较链表中的值来判断是否带环,因为链表中不同节点的值可以相同,我们要比较地址来判断是否带环
  2. 带环问题我们要用快慢指针来解决。让慢的指针一次走一步,快的指针一次走两步。这样如果链表中带环的话,慢指针一定会与快指针相遇。
  3. 地址相同就是相遇,说明链表带环

把带环的链表想象成这个样子
在这里插入图片描述

bool hasCycle(struct ListNode *head) {
    struct ListNode *fast = head;
    struct ListNode *slow = head;
    while(fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;
        if(fast == slow)
        {
            return true;
        }
    }
    return false;
}

142.给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 NULL

在这里插入图片描述

这道题我们要找到他的入环点。
在这里插入图片描述

1.假设快指针fast在与慢指针slow第一次相遇时 fast只在环内多跑了一圈 (b+c)
那么在相遇点相遇时,slow跑了 a+b,fast跑了a+(b+c)+b。
又因为快指针一次走两步,慢指针一次走一步所以有:2(a+b)=a+2b+c
所以推出 a = c
所以我们相遇后只需要再定义一个指针 cur 从头节点位置开始走,slow从相遇点开始走,他们两相遇时就是链表中环的起始点

2.fast也可能在环内跑了很多圈才与slow相遇
但slow走的路程永远a+b
在这里插入图片描述
fast在环内走了很多圈后与slow相遇
在这里插入图片描述
fast走的时slow的二倍在这里插入图片描述
同时去掉b在这里插入图片描述>同时减去一个a在这里插入图片描述

所以得处结论,我们可以用cur 指向头节点,让慢指针在环内与cur同时走最终还是会在入环点相遇,返回相遇点即可

struct ListNode *detectCycle(struct ListNode *head) {
    struct ListNode *fast = head;
    struct ListNode *slow = head;
    while(fast && fast->next)
    {
        fast = fast->next->next;
        slow = slow->next;
        if(fast == slow)
        {
            struct ListNode *cur = head;
            while(1)
            {
                if(cur == slow)
                {
                    return slow;
                }
                cur = cur->next;
                slow = slow->next;
            }
        }
    }
    return NULL;
}

http://www.kler.cn/a/315141.html

相关文章:

  • SLAM/数字图象处理基础
  • MyBatis的插件运行原理,与如何编写一个插件
  • 详细解读SAQ评级
  • linux 常用 Linux 命令指南
  • lxml 解析xml\html
  • 基于kraft部署kafka集群
  • Facebook运营:账号类型有哪些?有必要用静态住宅IP吗?
  • 快速理解MySQL索引:优化查询性能的利器
  • 动手深度学习 线性回归从零开始实现实例
  • 招商银行招行笔试难度递增?要点解读
  • harbor私有镜像仓库,搭建及管理
  • [Unity Demo]从零开始制作空洞骑士Hollow Knight第七集:制作小骑士完整的冲刺Dash行为
  • 如何切换淘宝最新镜像源(npm)【2024版】
  • 828华为云征文|华为云Flexus X实例docker部署最新Appsmith社区版,搭建自己的低代码平台
  • contenteditable=“true“可编辑div字数限制
  • qwen2.5 vllm推理;openai function call调用中文离线agents使用
  • 基于树莓派ubuntu20.04的ros-noetic小车
  • 程序员软硬通吃的核心竞争力修炼指南
  • 001、GitLabApi使用
  • 存储系统概述
  • 力扣674-最长连续递增序列(Java详细题解)
  • glTF格式:WebGL应用的3D资产优化解决方案
  • 反编译 AndroidManifest.xml文件-android反编译技术
  • 408算法题leetcode--第11天
  • 4.提升客户服务体验:ChatGPT在客服中的应用(4/10)
  • 如何用 HAproxy 实施高可用部署 | OceanBase 实践