判断循环链表以及其环入口

文章目录

  • 题目
    • 题目链接
    • 题目要求
  • 解题思路
    • 方法一:哈希表
    • 方法二:双指针
  • 进阶思考
    • 快指针一次走三步
  • 进阶问题(入口点)
    • 题目链接
    • 题目要求
    • 问题思路
  • 总结

题目

题目链接

环形链表

题目要求

在这里插入图片描述

解题思路

显而易见的是,单纯的遍历循环是肯定不行的,既然是循环,关键就是要找到重复的地址,用值判断不行的,可能有重复的值

方法一:哈希表

1,用哈希表储存节点指针的值,找到重复的则返回TRUE。

class Solution {
public:bool HasCycle(ListNode *head) {unordered_set<ListNode*> hashtable; //哈希表while (head != nullptr) {if (hashtable.count(head)) {//如果当前节点已经有存储,则说明有重复return true;}//插入节点hashtable.insert(head);head = head->next;}return false;}
};

方法二:双指针

1,即使不会哈希表也没关系,用常见的快慢指针也可以解题。

2,不是循环链表:快指针会到达空节点,直接返回false即可。
3, 是循环链表:快指针先进入环中,变成追击问题,画图如下。

在这里插入图片描述
4,追击过程中,距离变化:(快指针一次两步,慢指针一次一步)

在这里插入图片描述
代码实现:

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

进阶思考

快指针一次走三步

1,快指针相当于每次追击两步,要分情况讨论初始距离的情况。

如下

在这里插入图片描述
2,可以看出,当N为偶数时是可以追上的,当N为奇数则分情况

  • 距离为-1时,实际距离是C-1(C为环的长度)

如图

在这里插入图片描述
3,可以看出,C为奇数时可以达成,为偶数则不行。

4,更多的步数则是以此类推。

进阶问题(入口点)

题目链接

环形链表入口

题目要求

在这里插入图片描述

问题思路

1,显而易见,第一个重复的节点就是入口节点,可以用哈希表判断,直接返回第一个节点。

代码

class Solution {
public:ListNode *detectCycle(ListNode *head) {unordered_set<ListNode *> visited;while (head != nullptr) {if (visited.count(head)) {return head;}visited.insert(head);head = head->next;}return nullptr;}
};

2,快慢指针,经过前面的推论我们可以进一步推导得到如下:

在这里插入图片描述

3,如此可知,M为1的时候, 一个指针从相遇点走,一个从起点走,最终在入口点相遇

代码实现

class Solution {
public:ListNode *detectCycle(ListNode *head) {ListNode *slow = head, *fast = head;while (fast != nullptr) {slow = slow->next;if (fast->next == nullptr) {return nullptr;}fast = fast->next->next;if (fast == slow) {ListNode *ptr = head;while (ptr != slow) {ptr = ptr->next;slow = slow->next;}return ptr;}}return nullptr;}
};

总结

做这种题需要假设举例,一定的数学推导,从例子中找出其中的普遍规律,才能快速解题。

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

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

相关文章

day7 c++

整理代码 1、unique_ptr 指针 #include <iostream> #include <memory> using namespace std; class Demo {public:Demo(){cout<<"无参构造"<<endl;}~Demo(){cout<<"Demo的析构函数"<<endl;} };int main() {//unique…

python 笔记:cls VS self

cls&#xff1a; 用于类方法&#xff1a; cls 通常作为类方法&#xff08;用 classmethod 装饰&#xff09;中的第一个参数。它指代调用该方法的类本身&#xff0c;无论该类有没有被实例化访问类级别的属性和方法 通过 cls&#xff0c;可以访问类级别的属性和方法。可以通过 c…

【IDEA】IDEA自带Maven/JDK,不需要下载

IDEA是由Java编写的&#xff0c;为了保证其运行&#xff0c;内部是自带JDK的。IDEA 2021 及 之后的版本是自带Maven的&#xff1a; 视频连接&#xff1a; https://www.bilibili.com/video/BV1Cs4y1b7JC?p4&spm_id_frompageDriver&vd_source5534adbd427e3b01c725714cd…

理解Linux文件系统

文章目录 一、引言二、Linux文件系统概述1、文件系统的结构2、文件系统目录树的逻辑结构 二、文件系统的特性1、super block&#xff1a;文件系统的超级块2、inode&#xff1a;文件系统的索引节点3、inode table4、block&#xff1a;文件系统的数据块5、块组描述符表&#xff0…

链表例题(分割链表)

链接&#xff1a; . - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 即将小于特定值的节点放在前面&#xff0c;大于特定值的节点接在后面 思路&#xff1a; 我们可以创建两个链表分别存放大于的值和小于的值。5个变量&#xff08;记录链表当前位置的指针st…

Spring Kafka——基于 Spring Kafka 实现动态管理 Kafka 连接和 topic 的监听

文章目录 使用 Spring Kafka 动态管理 Kafka 连接和主题监听1. 前言2. 简单的消费程序配置3. Spring Kafka 主要的相关类的说明4. KafkaListener 注解的加载执行流程解析5. 动态监听消费订阅的设计与实现 使用 Spring Kafka 动态管理 Kafka 连接和主题监听 文章内容较长&#x…

云托管 代码 项目

代码(云)托管平台 国内&#xff1a; Coding&#xff08;https://coding.net&#xff09;&#xff1a;Coding是国内知名的代码托管平台&#xff0c;支持Git和SVN版本控制系统。它提供了代码托管、项目管理、协作开发、持续集成等功能&#xff0c;并且支持与其他开发工具的集成&a…

css div块标签内的多个英语单词怎样设置换行

背景&#xff1a; 在<div>标签内&#xff0c;当接口返回的字符串全是英文字母&#xff0c;不会自动换行。 原因&#xff1a;查过相关资料后才知道&#xff0c;只有英文文本才会出现不能自动换行的情况&#xff0c;&#xff08;中文不存在&#xff09;而原因是因为英文文本…

GNU/Linux - tty设备介绍

在 Linux 和其他类 Unix 操作系统中&#xff0c;"TTY "代表 "电传打字机"。最初&#xff0c;TTY 指的是用于文本通信的物理电传打字机终端&#xff0c;但在现代用法中&#xff0c;它一般指在图形环境或基于文本的控制台中用于文本输入和输出的虚拟终端或终…

【antd + vue】InputNumber 数字输入框 输入限制

一、需求说明 只能输入数字和小数点&#xff0c;保留小数点后两位&#xff1b;最多输入6位&#xff1b;删除所有内容时&#xff0c;默认为0&#xff1b; 二、问题说明 问题1&#xff1a;使用 precision 数值精度 时&#xff0c;超出规定小数位数时会自动四舍五入&#xff1b;…

如何在Linux中使用Socks5代理?

Socks5代理是一種網路協議&#xff0c;用於在客戶端和服務器之間中轉網路數據包。這種代理協議可以處理任何類型的網路流量&#xff0c;包括HTTP和FTP等協議。此外&#xff0c;Socks5代理還支持各種身份驗證方法&#xff0c;包括無驗證、用戶名/密碼驗證和GSSAPI。 Socks5代理…

水库大坝安全白蚁监测系统解决方案

一、系统背景 白蚁作为河岸生态系统中的重要病害&#xff0c;不仅会导致水库大坝外部环境发生改变&#xff0c;甚至会引发水库大坝破坏&#xff0c;进而导致自身结构失去稳定性&#xff0c;严重影响水库大坝的正常运行。因此&#xff0c;治理水库大坝白蚁是确保水库大坝工程顺利…

翻译: 什么是ChatGPT 通过图形化的方式来理解 Transformer 架构 深度学习二

合集 ChatGPT 通过图形化的方式来理解 Transformer 架构 翻译: 什么是ChatGPT 通过图形化的方式来理解 Transformer 架构 深度学习一翻译: 什么是ChatGPT 通过图形化的方式来理解 Transformer 架构 深度学习二翻译: 什么是ChatGPT 通过图形化的方式来理解 Transformer 架构 深…

C++人工智能01C版本

这次新增了个游戏功能 看代码 #include"bits/stdc.h" #include"Windows.h" #define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0) using namespace std; bool memory[11]{false}; char z[1048576]{}; void calculator(char…

在 Python 开发中建议使用虚拟环境的原因

在 Python 开发中使用虚拟环境可以解决依赖冲突问题、方便管理和记录项目依赖库版本、提高代码的可移植性和可重现性、隔离不同项目的 Python 环境、方便切换不同项目的开发环境&#xff0c;无论是个人项目还是团队项目&#xff0c;使用虚拟环境已经成为 Python 开发的最佳实践…

Julia和Python蛛网图轨道图庞加莱截面曲面确定性非线性系统

&#x1f3af;要点 &#x1f3af;确定性混沌系统计算和视图&#xff1a;&#x1f58a;庞加莱截面曲面&#xff0c;赫农-海尔斯系统和洛伦兹 63 系统。&#x1f3af;零斜线演示可激发系统计算和视图&#xff1a;&#x1f58a; 庞加莱-本迪克松定理求解二维连续系统常微分方程 |…

STM32中断之TIM定时器详解

系列文章目录 STM32单片机系列专栏 C语言术语和结构总结专栏 文章目录 1. TIM简述 2. 定时器类型 2.1 基本定时器 2.2 通用定时器 2.3 高级定时器 3. 定时中断 4. 代码示例1 5. 代码示例2 1. TIM简述 定时器的基本功能&#xff1a;定时器可以在预定的时间间隔内产生周…

谷歌研发“SEEDS”新型天气预报模型:更准确地报道极端事件

谷歌科技近日公布了一项震撼业界的天气预报研究成果&#xff0c;这一成果不仅标志着天气预测技术的重大突破&#xff0c;更是人工智能技术在传统领域应用的又一里程碑。他们成功研发了名为SEEDS&#xff08;Scalable Ensemble Envelope Diffusion Sampler&#xff09;的新型预报…

【AIGC】深入探索AIGC技术在文本生成与音频生成领域的应用

&#x1f680;文章标题 &#x1f680;AIGC之文本生成&#x1f680;应用型文本生成&#x1f680;创作型文本生成&#x1f680;文本辅助生成&#x1f680;重点关注场景 &#x1f680;音频及文字—音频生成&#x1f680;TTS(Text-to-speech)场景&#x1f680;乐曲/歌曲生成&#x…

访问jwt生成token404解决方法

背景&#xff1a; 1.在部署新的阿里云环境后发现调用jwt生成token的方法404&#xff0c;前端除了404&#xff0c;台不报任何错误 在本地好用&#xff0c;在老的阿里云环境好用&#xff0c; 2.缩短生成私钥的参数报错&#xff0c;以为私钥太长改了tomcat参数也无效&#xff0…