链表经典题目:环形链表问题(LeetCode141.环形链表、LeetCode142.环形链表Ⅱ)

📇文章目录

  • 📜 LeetCode141. 环形链表
      • 🔶题目描述
      • 🔷思路分析
      • ✔️代码实现
  • 📜 LeetCode142.环形链表Ⅱ
      • 🔶题目描述
      • 🔷思路①
      • ✔️代码实现
      • 🔷思路②
  • 📒总结

📜 LeetCode141. 环形链表

🔶题目描述

题目戳➡️LeetCode141.环形链表

给你一个链表的头节点 head ,判断链表中是否有环.
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。
为了表示给定链 表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。
注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。 如果链表中存在环 ,则返回 true 。 否则,返回 false
在这里插入图片描述

🔷思路分析

   错误思路:

  • 可能刚上来我们会这样想,遍历整个链表,如果找不到空说明就有环
    但是有没有考虑过,如果链表有环,那么永远找不到空! 不就死循环了吗
    你的程序就崩溃了 所以这种思路是错误的!

那么正确的思路是要怎么做呢?
➡️ 快慢指针

定义一个fast指针 和一个 slow指针,

  • fast一次走两步,slow一次走一步
    那么 ,如果fast走到尾 那么slow刚好走了链表的一半
    如果fast走到了空 说明链表没有环
  • 如果fast走到尾部 还没有停止 说明链表有环
    fast进入环之后 就变成了追及问题(龟兔赛跑)
    –那么我们就有思路了:如果快指针可以追得上满指针 说明有环!
    –反之无环!

但这时候又会有一个问题:链表的节点数是奇数还是偶数呢?
让我们画图分析:
➡️

  • 奇数情况:在这里插入图片描述
  • 偶数情况
    在这里插入图片描述
    总结: 只要fastfast->next 有一个可以走到空 说明链表无环
                否则一定有环,那么当fast追上slow的时候 返回真即可!

在这里插入图片描述

✔️代码实现

bool hasCycle(struct ListNode *head) {
struct ListNode* fast=head,*slow=head;
 	//定义一个快指针和慢指针
  //快指针一次走一步 慢指针一次走两步
  // 如果快指针走到空了 还没有找到交点 说明!没有环
  while(fast&&fast->next)
  {
      fast=fast->next->next;
      slow=slow->next;
      //如果fast追上slow 
      if(fast==slow)
      {
          return true;
      }
  }
  return false;
}

📜 LeetCode142.环形链表Ⅱ

🔶题目描述

题目戳➡️LeetCode142.环形链表Ⅱ

给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null

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

🔷思路①

  上一个题我们可以挺容易的消除如何判断是不是有环,因为我们只需要判断有没有即可,不需要找出具体的在哪。但是这个题要求我们找出他的入环节点 这要怎么找呢?
其实这个题用到了一点数学知识,请听我分析:
首先还是利用快慢指针,定义一个快指针fast和一个慢指针slow,快指针一次走两步,慢指针一次走一步,然后如果有环,那么标记fastslow的相遇节点为meet 然后这个时候meethead同时开始
向后走,等到他俩相遇的时候,这时候的节点就是入环的第一个节点!
画图分析:
在这里插入图片描述
在这里插入图片描述

  • 所以 由上面的公式化简一下就得到:L=(N-1)*C+(C-K)
    从meet点开始转动N-1圈 再走C-K步 就等于 L的长度
    如果N=1的时候 那么L=C-K
    所以如果一个点在meet开始走,一个点在head开始走,那么 当二者相遇的时候,一定是在入环点!

✔️代码实现

代码就很简单了:

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* meet=fast;
          while(meet!=head)
          {
              meet=meet->next;
              head=head->next;
          }
          //相交的地方也就是 入环的节点!
          return meet;
      }
  }
  return NULL;
}

🔷思路②

还有一种思路就是
如果我们在fastslow相遇的点meet处切开会发生什么呢?
如图:
在这里插入图片描述
是不是有点熟悉 ?没错!链表相交

那么解题思路就是:
首先找到meet节点,然后meet的下一个节点(nehead) 作为一个新的链表的头部,meet作为尾节点 ,所以这就变成了两个链表相交
所以我们遍历两个单链表找出各自的长度,让长的链表先走,走到二者长度相等的时候,一次比较两个链表的每一个节点,如果有相等n那么直接返回即可,如果没有相等的节点,那么返回空

📒总结

🌟🌟🌟
环形链表问题在面试中是经常爱考的,你有没有发现环形链表的题目代码都没有很难,一般是思路难以想到,所以人家考你的是思路,并不真的会纠你代码写的怎么样!
对于环形链表①,如果面试官这样问你:

  • 快指针必须一次走2步吗?可以一次走3步,走4步可以吗?你会怎么回答?
  • 怎么证明快指针一次走2步一定可以追上?

这里我们简单证明一下:

➡️快指针一次走2步那么一定可以追得上

首先需要知道,fast什么时候开始追击slow
因为fast首先进入环,在slow进环之前,二者的运动路径并不一样!只有当slow也开始进环,才开始所谓的追及问题
假设slow进环以后,fastslow的距离是N
那么fast开始追击slow,二者相对速度为1 ,在追击过程中,它们之间的距离每一次都缩小1
所以距离的变化为:N–> N-1 -->N-2–>···->3–>2–>1–>0
所以一定可以追得上!

➡️可以一次走3步吗

假设slow进环的时候以后,fast与slow的距离为N,环的大小是C
这时候,如果fast开始追击slowfast一次走3步,slow一次走1步,
他们之间的距离一次缩小2步

  • 如果N为偶数
     那么N的变化为:N->N-2->N-4->···->4->2->0 显然可以相遇
  • 如果N为奇数
     那么N的变化为: N->N-2->N-4->···->3->1->-1!
     那么 slowfast之间的距离为-1(擦肩而过!) , 他们之间的距离变成了C-1 这时候如果C-1为偶数那么可以相遇,如果C-1为奇数那么永远不会相遇!
    画图看一下:
    在这里插入图片描述

🌟🌟🌟


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/712323.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

神经网络学习2

张量(Tensor)是深度学习和科学计算中的基本数据结构,用于表示多维数组。张量可以看作是一个更广义的概念,涵盖了标量、向量、矩阵以及更高维度的数据结构。具体来说,张量的维度可以是以下几种形式: 标量&am…

RabbitMQ实践——利用一致性Hash交换器做负载均衡

大纲 开启一致性Hash交换器创建交换器创建绑定关系测试参考资料 在《RabbitMQ实践——交换器(Exchange)和绑定(Banding)》中,我们熟悉了Direct、Fanout、Topic和Header这4种系统默认支持的交换器。这些交换器基本可以满…

Django REST framework关联序列化器详解:掌握复杂关系的序列化与反序列化艺术

系列文章目录 Django入门全攻略:从零搭建你的第一个Web项目Django ORM入门指南:从概念到实践,掌握模型创建、迁移与视图操作Django ORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解Django ORM深度游&#xff…

军事武器3D数字化交互展示创作平台大大降低成本

军事力量和装备是一个国家国防安全的重要支柱,这在全球范围内得到广泛认同,为了让入伍的新兵能快速熟悉和掌握武器装备操作流程,基于创新型的华锐3D云展平台工具,搭建的3D军事武器展示搭建编辑器,让部队的军事武器展示…

Golang——gRPC gateway网关

前言 etcd3 API全面升级为gRPC后,同时要提供REST API服务,维护两个版本的服务显然不大合理,所以gRPC-gateway诞生了。通过protobuf的自定义option实现了一个网关。服务端同时开启gRPC和HTTP服务,HTTP服务接收客户端请求后转换为gr…

Javaweb8 数据库Mybatis+JDBC

Mybatis Dao层,用于简化JDBC开发 1步中的实体类 int类型一般用Integer :如果用int类型 默认值为0,会影响数据的判断,用Integer默认值是null,不会给数据的判断造成干扰 2.在application .properties里配置数据库的链接信息-四要素 #驱动类名称 #URL #用…

Elasticsearch 认证模拟题 - 21

一、题目 写一个查询,要求查询 kibana_sample_data_ecommerce 索引,且 day_of_week、customer_gender、currency、type 这 4 个字段中至少两个以上。 1.1 考点 Boolean 1.2 答案 GET kibana_sample_data_ecommerce/_search {"query": {&q…

C-冒泡排序的循环条件应该怎么写

目录 一、冒泡排序的原理 二、代码实现 三、代码解读 1. 第一层循环条件怎么来的 2.第二层循环条件怎么来的 四、优化代码 我发现,好像还是有一部分同志,没有很清楚冒泡排序的两层循环条件为什么这么写? 感到有些模糊,但又可…

光照药物稳定性试验箱百科

概念与作用 - 药品稳定性试验箱:一种精密设备,用于模拟药品在不同环境条件下的存储情况。 - 环境模拟:通过控制温度、湿度等参数,复制各种实际储存条件,以测试药品稳定性。 - 保障药品质量:通过试验&…

Mybatis做批量操作

动态标签foreach,做过批量操作,但是foreach只能处理记录数不多的批量操作,数据量大了后,先不说效率,能不能成功操作都是问题,所以这里讲一讲Mybatis正确的批量操作方法: 在获取opensession对象…

conda安装pytorch使用清华源

原命令,例: # CUDA 11.3 conda install pytorch1.11.0 torchvision0.12.0 torchaudio0.11.0 cudatoolkit11.3 -c pytorch使用清华源,例: # CUDA 11.3 conda install pytorch1.11.0 torchvision0.12.0 torchaudio0.11.0 cudatool…

Win11 问题集

文章目录 一、Win11 选择其他应用打开无反应1、新建 1.reg 文件2、新建 2.reg 文件3、运行 reg 文件 二、Win11 账户怎么改名 一、Win11 选择其他应用打开无反应 Win11选择打开方式卡死怎么办? 选择打开方式没有反应的解决办法 1、新建 1.reg 文件 1.reg Windows Registry…

技术转管理,是灾难还是奇迹?

深耕技术or转战管理?this is a question! 如果你还没有想好,那请继续往下看! 技术专家:技术前瞻者、方案构建者、难题破解者、团队聚核者 管理专家:战略规划者、高效组织者、变革引领者、团队建设者 特点和重心都不在…

RN6752V1 高性能AHD转MIPIDVPBT656BT601芯片方案,目前适用于车载方案居多

RN6752V1描述: RN6752V1是一种模拟高清晰度(模拟高清)视频解码器IC,专为汽车应用而设计。它集成了所有必要的功能块: AFE,PLL,解码逻辑,MIPI和I2C接口等,在一个小的5mm …

三、网络服务协议

目录 一、FTP:文件传输协议 二、Telnet:远程登录协议 三、AAA认证 四、DHCP 五、DNS 六、PPP协议 七、ISIS协议 一、FTP:文件传输协议 C/S架构,现多用于企业内部的资料共享和网络设备的文件传输,企业内部搭建一…

windows10或者windows11怎么查看自己电脑显卡型号

win10系统: 右键单击任务栏后弹出菜单选择任务管理器 打开任务管理器后,点击性能查看左侧GPU0或者GPU1 如果有nvidia字样表示自己电脑有nvidia显卡,如果是AMD或者intel字样表示没有nvidia显卡。注意如果你有GPU0或者GPU1说明你电脑是双显卡&…

2.2 利用MyBatis实现CRUD操作

MyBatis 是一个半自动的持久层框架,它简化了数据库操作,允许开发者通过 XML 或注解的方式来配置 SQL 语句,实现数据的增删改查(CRUD)操作。 1. 环境搭建 引入依赖:在项目中添加 MyBatis 以及数据库驱动的…

Windows 服务器Nginx 下载、部署、配置流程(图文教程)

不定期更新 目录 一、下载Nginx安装包 二、上传安装包 三、启动Nginx 四、Nginx常用命令 五、Nginx(最小)配置详解 六、Nginx(基础)配置详解 七、反向代理 八、负载均衡 九、动静分离 十、报错 一、下载Nginx安装包 四…

大数据实训项目(小麦种子)-01、VirtualBox安装与Centos7系统安装

文章目录 前言项目介绍项目任务目标一、VirtualBox安装1.1、认识VirtualBox1.2、VirtualBox的下载安装 二、VirtualBox安装Centos7系统2.1、VirtualBox安装Centos72.2、Centos7配置静态IP地址2.3、Centos7环境基础配置 三、Windows安装FinalShell及连接Centos73.1、FinalShell下…

QT打包(windows linux)封包 完整图文版

目录 简介: 一. for windows 1.首先下载组件 2.开始构建Release版本. 3.然后点击构建 4.在文件夹内直接点击exe文件,会报下面的错误,因为缺少dll连接; 5.需要把这个exe单独复制到一个文件夹内, 6.先cd到单独exe所在的文件夹; cd 文件路径 7.然后运行 windeployqt 文…