判断链表是否有环并求环的入口和环的长度

2023-10-04 19:40

本文主要是介绍判断链表是否有环并求环的入口和环的长度,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

方法:

  1. 求链表是否有环,最直观的方法是从头结点的地址开始,把下一个地址都取出来,然后比对,是否有相同的。但这个方法需要两两比较,算法时间复杂度较高。
  2. 更好的一个做法是快慢指针(慢指针一次前进一个地址,快指针一次前进两个地址)同时从头结点出发,只有链表有环存在,则它们必定会相遇。
  3. 快慢指针算法有一个注意点,慢指针进入环之前,快指针可能已经在环中绕了几次圈了。
  4. 首先比较简单的是求环的长度,当快慢指针第一次相遇,可以确定的一点是它们一定都在环中,那么按照它们原先的速度绕圈,当第二次相遇的时候,环的长度就出来了。
  5. 求环的入口相对比较难想到,要分段来求,(假设 a 是从头结点到环入口,r是环周长)
    A. 假设慢指针刚刚到达环入口,此时快指针在距离环入口 x 处。这一点能给到我们的信息是 a = x + nr (n=1,2,3,4)
    这里写图片描述
    B. 从这点之后,实际上问题转化成在环上,快指针去追慢指针,而追击的距离变成环的长度,y - x 的距离。由于速度差是1,很明显被追到的时候,慢指针走过y-x的距离,也就是慢指针距离环入口 x 的距离。这里写图片描述
    C. 从相遇的这个地方开始,慢指针继续走 x + nr ,即 a 的距离,则到达环入口。所以我们只需同时从头指针出发一个慢指针,两者相遇即为环入口。

看完思路可以去实现一波: 牛客地址

class Solution {
public:ListNode* EntryNodeOfLoop(ListNode* pHead){ListNode * fast=pHead;ListNode * slow = pHead;//快指针和慢指针在头结点开始跑,第一次相遇停下while(fast != NULL && fast->next != NULL){slow = slow->next;fast = fast->next->next;if(fast == slow) {//第二个慢指针从头结点出发ListNode * slow2 = pHead;while(slow2 != slow) {slow2 = slow2->next;slow = slow->next;}return slow;}}return NULL;}
};

这篇关于判断链表是否有环并求环的入口和环的长度的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/2600

相关文章

检查 Nginx 是否启动的几种方法

《检查Nginx是否启动的几种方法》本文主要介绍了检查Nginx是否启动的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1. 使用 systemctl 命令(推荐)2. 使用 service 命令3. 检查进程是否存在4

java中判断json key是否存在的几种方法

《java中判断jsonkey是否存在的几种方法》在使用Java处理JSON数据时,如何判断某一个key是否存在?本文就来介绍三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目http://www.chinasem.cn录第一种方法是使用 jsONObject 的 has 方法

MySQL使用EXISTS检查记录是否存在的详细过程

《MySQL使用EXISTS检查记录是否存在的详细过程》EXISTS是SQL中用于检查子查询是否返回至少一条记录的运算符,它通常用于测试是否存在满足特定条件的记录,从而在主查询中进行相应操作,本文给大... 目录基本语法示例数据库和表结构1. 使用 EXISTS 在 SELECT 语句中2. 使用 EXIS

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

如何通过try-catch判断数据库唯一键字段是否重复

《如何通过try-catch判断数据库唯一键字段是否重复》在MyBatis+MySQL中,通过try-catch捕获唯一约束异常可避免重复数据查询,优点是减少数据库交互、提升并发安全,缺点是异常处理开... 目录1、原理2、怎么理解“异常走的是数据库错误路径,开销比普通逻辑分支稍高”?1. 普通逻辑分支 v

从基础到进阶详解Python条件判断的实用指南

《从基础到进阶详解Python条件判断的实用指南》本文将通过15个实战案例,带你大家掌握条件判断的核心技巧,并从基础语法到高级应用一网打尽,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录​引言:条件判断为何如此重要一、基础语法:三行代码构建决策系统二、多条件分支:elif的魔法三、

Linux实现查看某一端口是否开放

《Linux实现查看某一端口是否开放》文章介绍了三种检查端口6379是否开放的方法:通过lsof查看进程占用,用netstat区分TCP/UDP监听状态,以及用telnet测试远程连接可达性... 目录1、使用lsof 命令来查看端口是否开放2、使用netstat 命令来查看端口是否开放3、使用telnet

Java集合中的链表与结构详解

《Java集合中的链表与结构详解》链表是一种物理存储结构上非连续的存储结构,数据元素的逻辑顺序的通过链表中的引用链接次序实现,文章对比ArrayList与LinkedList的结构差异,详细讲解了链表... 目录一、链表概念与结构二、当向单链表的实现2.1 准备工作2.2 初始化链表2.3 打印数据、链表长

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

MySQL 获取字符串长度及注意事项

《MySQL获取字符串长度及注意事项》本文通过实例代码给大家介绍MySQL获取字符串长度及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 获取字符串长度详解 核心长度函数对比⚠️ 六大关键注意事项1. 字符编码决定字节长度2