LeetCode-环形链表、环形链表 II

news2024/11/23 0:12:31

一、环形链表

. - 力扣(LeetCode)

判断是否有环,使用快慢指针,开始时都指向头节点,快指针每次走两部,慢指针每次走一步,如果在走的过程中,慢指针和快指针相同(也就是快指针和慢指针指向的节点的同)那么就说明这个链表是带环链表;

原理: 

若是这个链表代换,那么快慢指针一定不会走向NULL;只会在这个链表里面循环走下去,并且当循环条件允许时都会进环;同时快指针走的每次都比慢指针多一步,若是一直走下去 ,虽说快指针开始一直在慢指针前面,但是每次快指针都多走一步,最后快指针一定会和慢指针相遇,(就像跑步速度相异的两人在环形跑道上面跑步同理,开始时快的再前面,可能一圈或是两圈之后,跑的快的一定会和跑的慢的相遇)

因此,我们可以把快慢指针相遇作为判断链表是否带环的判断准则,当快慢指针相遇,就说这个链表带环;

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 typedef struct ListNode ListNode;
bool hasCycle(struct ListNode *head) {
    
    ListNode* fast=head,*slow=head;

    while(fast && fast->next && slow)
    {
        fast=fast->next->next;
        slow=slow->next;
        
        if(fast==slow)
        {
            return true;
        }
    }
    return false;
}

当头节点为NULL,或者是头节点只有一个且这个节点的next为NULL时,不进入循环,直接返回false,可见这种情况也能兼容。

当fast每次走三步或者是更多步呢?(题外话)

先看快指针每次走三步的情况:假设有环,经过上面解法可知,快慢指针相遇一定在环内部;所以我们研究在环中的过程,当慢指针进环的时候快指针已经在换里面走了一会了,我们并不清楚它走了几圈或是多远;假设环可以容纳的节点个数是C(环的长度),假设慢指针刚刚进入环的时候距离环内快指针的距离是N,那么每走一步快慢指针之间的距离就减少2,若是N是偶数,那么快慢指针就能相遇;

若是N是奇数,那么快指针在接近慢指针时相遇的距离是奇数,但是两者每次距离减少偶数2,所以快指针会追上慢指针,并且多出慢指针一个节点的距离;进入第二轮,在环中此时两者之间的距离是(C-1);若是(C-1)是偶数,那么快慢指针最终会相遇;若是(C-1)是奇数,那么会出现和第一轮相同的情况:快指针多出慢指针一个节点的距离,此时两者之间的距离又变成了(C-1);而已知(C-1)是奇数,后面的都是同样如此,这样看来似乎快慢指针永远都不会相遇;

但其实不然:

上面快慢指针不会相遇的情况出现在该条件之下:当N是奇数的时候,C是偶数;这种条件真的存在吗?假设头节点距离进环节点的距离是L,研究慢指针刚刚进环的时刻;此时慢指针走了L,假设快指针在环内走了x圈,那么快指针走的总路程就是L+x*C+N(N是慢指针刚刚进入环的时候与快指针之间的距离),同时又因为快指针走的距离是慢指针的三倍,那么就有以下等式

3*L=L+x*C+N ;

2*L=x*C+N

带入快慢指针永远不会相遇的条件:N是奇数的时候,C是偶数;

因为2*L永远是偶数,而条件带入之后,等式右边无论x是几,等式右边的最终结果都是奇数

由此可知,这种条件不会存在;当快指针每次走的步数更多得到时候,也同样如此;也就是说快慢指针一定会相遇。 


二、环形链表 II

. - 力扣(LeetCode)

 本题思路:首先判断是否带环,若是不带环就返回NULL;若是带环则返回开始进环时的那个节点指针;判断带环与否参照上一题环形链表;而对于返回进环节点指针,使用下述方法:在判断完带环与否之后我们可以得知快慢指针相遇的节点,记录下这个相遇节点,设置一次循环,让头节点从头开始遍历,相遇节点从相遇的节点开始遍历,若是两个节点相同,那么这两个节点相遇时的节点就是进环时的节点;

原理:

假设进环时的节点和头节点之间的距离是L,fast和slow指针相遇的节点距离进环节点之间的距离是N,,快慢指针相遇之后快指针在环中走了x圈,环的长度是C,把快慢指针相遇的节点称为相遇节点;找等式关系,快指针每次走两步,慢指针每次走一步,快慢指针相遇之后,快指针走的距离是慢指针的两倍,慢指针走了L+N,快指针走了L+x*C+N ;那么就有

2*(L+N)=L+x*C+N;

L+N=x*C;

L=x*C-N;

L=(x-1)*C+C-N;

 得出这个关系就说明这种方法可以找到进环节点,解释:L是头节点距离进环节点的距离,头节点从头走起,相遇节点从快慢指针相遇的节点走起,两者每次都走一步,头节点走L时,相遇节点也走了L,也就是(x-1)*C+C-N;不用管(x-1)*C,因为走完(x-1)*C之后回到相遇节点,重点是C-N,我们已知相遇节点和进环节点之间的距离是N,这时已经走过的,未走过的是C-N,那么相遇节点的最后相当于走了C-N,刚好到进环节点;

所以可以利用头节点和相遇节点一起开始遍历、找出两者相同的节点的方法得出进环节点;

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 typedef struct ListNode ListNode;
struct ListNode *detectCycle(struct ListNode *head) {
    ListNode* fast=head,*slow=head;
    int flag=-1;
    
    while(fast && fast->next && slow)
    {
        slow=slow->next;
        fast=fast->next->next;
        if(fast==slow)
       {
            flag=1;
            break;
       }
    }
    if(flag==-1)
        return NULL;

    while(head!=slow)
    {
        head=head->next;
        slow=slow->next;
    } 
    return head;
}

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

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

相关文章

STM32第九课:STM32-基于标准库的42步进电机的简单I/O控制(附电机教程,看到即赚到)

一:步进电机简介 步进电机又称为脉冲电机,简而言之,就是一步一步前进的电机。基于最基本的电磁铁原理,它是一种可以自由回转的电磁铁,其动作原理是依靠气隙磁导的变化来产生电磁转矩,步进电机的角位移量与输入的脉冲个数严格成正比…

从Mac电脑硬盘驱动器恢复数据的3种方法[终极指南]

如果您的MacBook的启动磁盘损坏,并且您没有另一台Mac来安装恢复软件并恢复数据,该怎么办?相反,您随身携带的是 Windows 操作系统。 起初,您可能会陷入僵局,因为您无法启动到Mac并使用Mac恢复软件恢复数据&…

移动UI:具备什么特征,可以被认定为科技风格。

移动UI设计在科技风格上通常具备以下特征: 1. 清晰简洁的排版: 科技风格的移动UI通常采用清晰简洁的排版,注重信息的层次感和结构化,以便用户能够快速、直观地获取所需信息。 2. 几何形状和线条: 科技风格的移动UI常…

【大模型书籍】从零开始大模型开发与微调:基于PyTorch与ChatGLM(附PDF)

哈喽各位&#xff0c;今天又来给大家分享大模型学习书籍了&#xff0c;今天是这本<从零开始大模型开发与微调&#xff1a;基于PyTorch与ChatGLM 书籍PDF分享>&#xff0c;大模型是深度学习自然语言处理皇冠上的一颗明珠&#xff0c;也是当前AI和NLP研究与产业中最重要的方…

移动UI:任务中心的作用,该如何设计更合理?

任务中心是移动应用中用于展示和管理用户待办任务、提醒事项、用户福利、打卡签到等内容的功能模块。合理设计任务中心可以提升用户体验和工作效率。 以下是一些设计任务中心的合理建议&#xff1a; 1. 易于查看和管理&#xff1a; 任务中心的设计应该使用户能够快速、直观地…

python基础知识点(蓝桥杯python科目个人复习计划69)

做些基础题 第一题&#xff1a;微生物增值 题目描述&#xff1a; 假设有两种微生物x和y。 x出生后每隔3分钟分裂一次&#xff08;数目加倍&#xff09;&#xff0c;y出生后每隔2分钟分裂一次&#xff08;数目加倍&#xff09;。 一个新出生的x&#xff0c;半分钟之后吃掉一…

STM32学习(1)--STM32介绍

STM32介绍 1.STM32简介2.ARM3.STM32F103C8T64.外设5.命名规则6.系统结构7.引脚定义8.启动配置9.最小系统电路 课程知识及代码来源均来自b站 江协科技&#xff0c;下学期即将做毕设&#xff0c;需要用到STM32单片机&#xff0c;在这个假期我将持续学习相关知识 1.STM32简介 ST…

免费压缩归档助手,一键搞定你的文件烦恼!

在这个数字化时代&#xff0c;我们每天都在与各种文件打交道。无论是工作文档、个人照片还是珍贵的视频&#xff0c;管理这些文件成了一项必不可少的任务。但你是否还在为文件的压缩、加密和解压缩而烦恼&#xff1f;别担心&#xff0c;我们为你带来了一款方便好用的免费软件—…

如何降低老年人患帕金森病的风险?

降低老年人患帕金森病风险的方法 避免接触有害物质&#xff1a;长期接触某些化学物质、农药或其他有害物质可能会增加患帕金森病的风险。应减少这些物质的暴露&#xff0c;例如在工作或生活中采取防护措施。 健康饮食&#xff1a;均衡饮食&#xff0c;多吃富含抗氧化剂的食物&a…

Richtek立锜科技可用于智能门铃的电源管理解决方案

新型的智能门铃不仅能满足呼叫、提醒的需要&#xff0c;还能在线监控、远程操作、闯入通知、记录过程&#xff0c;系统构成相对复杂&#xff0c;与传统门铃相比有了很大的改变。 从电源管理的角度来观察&#xff0c;满足这样需求的系统构成也相对复杂&#xff1a; 处于外置状态…

HTML+CSS+JS用户管理(可储存用户数据)

使用cookies记录账号密码信息&#xff0c;可以注册、登录、注销账号。 点赞❤️收藏⭐️关注&#x1f60d; 效果图 源代码在效果图后面 源代码 HTML <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <…

Python while循环

1.while循环格式 while 表达式:循环语句 使用break结束循环。 2.例 i 0 while True:print(i)i i 1if i > 101:break 结果&#xff1a; 这段代码从0循环到100&#xff0c;到101时结束循环。

在 PostgreSQL 里如何处理数据的存储优化和查询复杂度的平衡?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 在 PostgreSQL 里如何处理数据的存储优化和查询复杂度的平衡&#xff1f;一、理解数据存储优化和查询复…

网络安全保险产业发展洞察报告(2024)

数字经济高速增长&#xff0c;黑客攻击、数据泄露等网络安全风险可能直接导致企业遭受巨额的财务损失。网络安全保险作为风险转移和风险管理的有效工具&#xff0c;正逐渐成为数字安全框架中不可或缺的一环。 《网络安全保险产业发展洞察报告&#xff08;2024&#xff09;》梳…

独立站外链的数量和质量哪个更重要?

没有哪个更重要的说法&#xff0c;两者同样重要&#xff0c;很多人都有一个误解&#xff0c;认为质量才是重要的&#xff0c;质量当然重要&#xff0c;但一个网站全都是高质量的外链&#xff0c;反而会不自然&#xff0c;是极其有可能被谷歌判定为作弊外链的&#xff0c;而且这…

【python学习】标准库之文件目录访问-os.path方法和pathlib库的背景、功能、用法、代码示例和总结

引言 在Python中&#xff0c;处理文件和目录的访问有多种方式&#xff0c;其中两种最常用的方法是使用os.path模块和pathlib库 文章目录 引言一、os.path的定义二、os.path的功能2.1 路径分割和组合2.2 路径比较2.3 路径长度和组件获取2.4 路径转换2.5 路径命名 三、os.path的用…

JVM 内存介绍

本文主要介绍&#xff1a; JVM 内存分哪几个区&#xff0c;每个区的作用是什么 备注: 橙色:堆 和 方法区 &#xff0c;属于jvm公有部分,可以进行调优 灰色:java栈,本地方法栈和计数器 属于jvm的私有部分,不可进行调优 一个对象从创建到被回收的过程是怎样的? Personpnew Perso…

永磁同步电机高性能控制算法(14)—— 有源阻尼电流环

1.前言 在之前的之后中已经发过一篇复矢量电流环和我们平时用的比较多的前馈补偿的电流环的对比&#xff0c;感觉复矢量电流环的效果还是挺明显的。 https://zhuanlan.zhihu.com/p/682880365https://zhuanlan.zhihu.com/p/682880365 当时在看文献的时候&#xff0c;复矢量电…

itextpdf字体选择

itextpdf 版本7.2.5 itextpdf-html2pdf 版本4.0.5 这里讲的是通过html转pdf&#xff0c;在html2pdf中是通过html中font-family样式来确定字体的&#xff0c;那已知font-family的情况&#xff0c;怎么确定pdf中实际用的字体&#xff0c;大致分为两步&#xff1a; 1、通过font…

SpringBoot系列:通过AOP+注解优雅实现操作日志记录

文章目录 前言一、简介1.1 操作日志在企业应用中的重要性1.2 使用AOP和注解实现操作日志记录的好处 二、开发环境三、准备工作3.1 创建操作日志记录表3.2 创建系统日志实体类 四、代码实现4.1 创建业务枚举类4.2 创建日志注解4.3 创建操作状态枚举类4.4 创建IP工具类4.5 创建切…