面试经典150题——环形链表

Suffering, for the weak is the tomb of death, and for the strong is the soil of germinal ambition.​

1. 题目描述

image-20240307110749871

2.  题目分析与解析

2.1 思路一

这个题目就是判断一个链表有没有环,其实我们之讲过一个题目,就实现了判断链表有没有环的步骤:面试经典150题——快乐数,并且还有图示,就是使用快慢指针法,因此在本篇文章中就不过多赘述了,直接给出代码思路。

代码思路

  1. 定义两个指针,分别表示快慢指针

  2. 让快指针以2的速度前进,慢指针以1的速度前进

  3. 如果两个指针相交,说明链表中存在环结构,返回true

  4. 如果遍历到结尾仍然没有返回false就说明没有环,返回false

2.2 思路二

因为我们用一种很简单的思路如何判断自己是否在一个地方转圈,一个很好的方法就是在我们开始走的位置做一个标记,用来标注我们之前走过这个地方,如果未来我们又能发现这个标记,那么就说明我们绕圈了。

把这种思路对应在题目中,就是设置一个标记来表示我是否走过这个地方,如果走过我在后续遍历过程中又能回到这个地方,那么就说明链表存在环状结构,如果走到目的地(结尾),发现还是没有经历过标记点,那么就说明不存在环状结构,返回false。

如何标记?因为我们走的每一个点是一个ListNode对象,而对象的唯一标识就是它的引用或者hash值了吧?因此我们可以使用一个hashMap,用来存储每一个走过位置的hash,如果在后续遍历过程中还能匹配到之前走过的hash,那么就说明出现环状结构了。

代码思路

  1. 定义一个hashMap

  2. 遍历链表,没走过一个节点之前先判断该节点是否在hashMap存在,如果存在直接返回true

  3. 如果遍历完毕所有节点都没有返回false,那么说明不存在环状结构,返回false

3. 代码实现

3.1 思路一

image-20240307161948433

image-20240307161935463

3.2 思路二

使用哈希表——对比引用

image-20240307163536719

image-20240307163219728

使用哈希表——对比hash值

image-20240307163524394

image-20240307163456656

4. 相关复杂度分析

对于给出的三种解决环形链表问题的方法,我们来分析它们的时间和空间复杂度:

思路1:使用快慢指针

  • 时间复杂度:O(n),其中 n 是链表的长度。快指针每次移动两步,慢指针每次移动一步,因此快指针最多移动 n/2 次,慢指针最多移动 n 次,整体遍历的时间复杂度为 O(n)。

  • 空间复杂度:O(1),只使用了常数级别的额外空间。

思路2:使用哈希表(对比引用)

  • 时间复杂度:O(n),其中 n 是链表的长度。遍历链表需要 O(n) 的时间,同时在哈希表中查找节点是否存在的时间复杂度是 O(1)。

  • 空间复杂度:O(n),需要使用一个哈希表来存储链表中的节点,因此空间复杂度是 O(n),其中 n 是链表的长度。

思路3:使用哈希表(对比哈希值)

  • 时间复杂度:O(n),其中 n 是链表的长度。与思路2相似,遍历链表需要 O(n) 的时间,同时在哈希表中查找哈希值是否存在的时间复杂度是 O(1)。

  • 空间复杂度:O(n),需要使用一个哈希表来存储链表中的节点的哈希值,因此空间复杂度是 O(n),其中 n 是链表的长度。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【python进阶篇】面向对象编程(1)

面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。 在Python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定…

酷家乐显示被隐藏的模型的方法

在酷家乐中打开设计方案。 点击下面的眼睛图标。 在下拉菜单上方点击显示已隐藏模型。 此时可以看到方案中隐藏的模型都可以正常显示了。推荐:https://www.sx1c.com/37564.html 以上就是“酷家乐显示被隐藏的模型的方法”了,酷家乐的使用比较简单&am…

无处不在的便捷:D咖无人售卖咖啡机在公共场所的应用探索

在繁忙的现代生活中,无人售卖咖啡机作为一项便捷的服务,正逐渐在公共场所得到广泛应用。本文将探讨D咖无人售卖咖啡机在公共场所的应用场景和优势。 一、无人售卖咖啡机的应用场景 写字楼:写字楼内工作人员需要在繁忙的工作中寻找便捷的饮品解…

今日arXiv最热大模型论文:北大发布,通过上下文提示,让大模型学习一门新的语言

在人工智能领域,大语言模型(LLMs)的发展已经取得了显著的进步,它们在处理高资源语言方面表现出色。然而,对于资源较少的语言,尤其是极低资源语言,这些模型的支持却显得力不从心。这些语言往往缺…

基于Leatlet标注Geojson下载器实现

在上一篇文章中,我们学习了Leaflet的基础知识,包括如何创建地图、添加图层等。在本文中,我们将深入学习Leaflet中标注的创建和管理,包括如何添加标注、自定义标注图标、创建图层组、批量添加和删除标注、为标注添加属性和弹出框等…

【方法】如何打开7Z分卷压缩文件?

什么是7Z分卷压缩文件?就是在压缩文件时,将文件压缩成若干个大小一样、以“文件名.7z.序号”格式命名的7Z压缩包,可以方便存储和传输,如下图所示。 一、7Z分卷压缩文件如何打开? 我们只需要按照普通压缩包的打开方式&…

【GAMES101】Lecture03 Transformation 变换

目录 0 课程内容1 Why Study Transformation1.1 Modeling 模型变换1.2 Viewing 视图变换 2 2D Transformations 二维变换2.1 Scale 缩放变换2.2 Reflection Matrix 反射矩阵2.3 Shear Matrix 切变矩阵2.4 Rotate 旋转2.5 特点:线性变换可以用矩阵表示(Li…

《数字图像处理(MATLAB版)》相关算法代码及其分析(2)

目录 1 将8连通边界转换为4连通边界 1.1 移除对角线转折 1.2 插入额外像素 2 将边界信息转换为二进制图像 2.1 函数定义 2.2 参数处理和验证 2.3 默认大小参数设置 2.4 根据参数调整边界位置 2.5 生成二进制图像 2.6 错误处理 3 对二值图像边界的跟踪和提取 3.1 函…

网络仿真(二)

时延和丢包率 网络中的节点之间时延(延迟)和丢包率是衡量网络性能的两个关键指标。 时延(延迟):时延是指数据在网络中从一个节点传输到另一个节点所需的时间。这包括处理时延(数据在节点处理的时间&#x…

【CSP试题回顾】202109-1-数组推导

CSP-202109-1-数组推导 解题代码 #include<iostream> #include<vector> #include<algorithm> using namespace std;long long maxSum, minSum;int main() { int n;cin >> n;vector<int>B(n);for (auto& it : B){cin >> it;maxSum …

李想已经5天没发微博了

李想的微博已经5天没更新了。 理想MEGA发布之后的第二天&#xff0c;李想在微博转发了一条某汽车自媒体和理想MEGA设计师BenBaum的访谈视频&#xff0c;并配文表示&#xff0c;Ben的访谈非常好。 不过&#xff0c;在之后的5天时间里&#xff0c;李想的微博便悄无声息了。这与“…

Vue的HTML插入——v-html指令

有时我们希望将数据作为HTML代码插入到HTML模板中&#xff0c;而不是以纯文本的形式显示。在这种情况下&#xff0c;我们需要使用Vue.js的v-html指令&#xff1a; <template><div><p>纯文本: {{ rawText }}</p><p>属性: <span v-html"r…