相交链表+判断环型链表+求环型链表的入口节点

链表OJ题

  • 一.相交链表
  • 二.判断环型链表
  • 三.求环型链表的入口节点

一.相交链表

相交链表

在这里插入图片描述

相交:两个链表从头开始遍历,尾节点一定是同一个节点。

情况一:当两个链表长度相同时:
在这里插入图片描述

情况二:当两个链表长度不同时:

在这里插入图片描述
思路:

  1. 求两个链表长度的差值gap。
  2. 让长链表先走gap个节点。
  3. 分别遍历两个链表,比较是否为同一个节点,若是则相交,否则不相交。

代码如下:

typedef struct ListNode ListNode;struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) 
{ListNode* la = headA;ListNode* lb = headB;int lengthA = 0, lengthB = 0;while(la){lengthA++;//求链表A的长度la = la->next;}while(lb){lengthB++;//求链表B的长度lb = lb->next;}//求链表A与链表B长度差的绝对值int gap = abs(lengthA - lengthB);//找出长链表与短链表ListNode* longList = headA;ListNode* shortList = headB;if(lengthB > lengthA){longList = headB;shortList = headA;}//让长链表先走gap个节点while(gap--){longList = longList->next;}//此时longList与shortList指针在相对的位置上(同时遍历链表为NULL)//判断两个链表是否相交while(longList && shortList){if(longList == shortList){//链表相交return longList;}//两个指针继续往后走longList = longList->next;shortList = shortList->next;}//链表不相交return NULL;
}

二.判断环型链表

环型链表

在这里插入图片描述

思路:快慢指针,即慢指针一次⾛一步,快指针一次走两步,两个指针从链表起始位置开始行,如果链表带环则一定会在环中相遇,否则快指针率先走到链表的未尾。

思考1:为什么快指针每次走两步,慢指针走一步可以相遇,有没有可能遇不上,请推理证明!
在这里插入图片描述

因此,在带环链表中慢指针走一步,快指针走两步最终一定会相遇。

思考2:快指针一次走3步,走4步,…n步行吗?

在这里插入图片描述
在这里插入图片描述

思考:真的存在N是奇数,C是偶数这一条件???

下面给出等式:
在这里插入图片描述

在这里插入图片描述

代码如下:

  1. 慢指针一次走一步,快指针一次走两步
typedef struct ListNode ListNode;bool hasCycle(struct ListNode* head)
{ListNode* slow = head;ListNode* fast = head;while (fast && fast->next){//慢指针一次走一步,快指针一次走两步slow = slow->next;fast = fast->next->next;//当慢指针 == 快指针时,有环if (slow == fast){return true;}}//无环return false;
}
  1. 慢指针一次走一步,快指针一次走三步:
typedef struct ListNode ListNode;bool hasCycle(struct ListNode *head) 
{ListNode* slow = head;ListNode* fast = head;while(fast && fast->next && fast->next->next){//慢指针一次走一步,快指针一次走三步slow = slow->next;fast = fast->next->next->next;//当慢指针 == 快指针时,有环if(slow == fast){return true;}}//无环return false;
}

三.求环型链表的入口节点

环型链表 ||

在这里插入图片描述

思路:快慢指针,快指针一次走两步,慢指针一次走一步,若为环型链表最终在环中相遇,然后让一个指针从相遇点开始走,一个指针从起点开始走,一次走一步,最终在进环处相遇。

在这里插入图片描述

代码如下:

//解:快慢指针,快指针一次走两步,慢指针一次走一步,若为环型链表最终在环中相遇//    然后让一个指针从相遇点开始走,一个指针从起点开始走,一次走一步,最终在进环处相遇typedef struct ListNode ListNode;struct ListNode* detectCycle(struct ListNode* head)
{ListNode* slow = head;ListNode* fast = head;while (fast && fast->next){slow = slow->next;fast = fast->next->next;if (slow == fast){//有环ListNode* meet = slow;//相遇点while (meet != head){//一个指针从相遇点开始走,一个指针从起点开始走,最终一定在入环点相遇head = head->next;meet = meet->next;}return meet;//入环点}}return NULL;//无环
}

在这里插入图片描述

typedef struct ListNode ListNode;struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) 
{ListNode* la = headA;ListNode* lb = headB;int lengthA = 0, lengthB = 0;while(la){lengthA++;//求链表A的长度la = la->next;}while(lb){lengthB++;//求链表B的长度lb = lb->next;}//求链表A与链表B长度差的绝对值int gap = abs(lengthA - lengthB);//找出长链表与短链表ListNode* longList = headA;ListNode* shortList = headB;if(lengthB > lengthA){longList = headB;shortList = headA;}//让长链表先走gap个节点while(gap--){longList = longList->next;}//此时longList与shortList指针在相对的位置上(同时遍历链表为NULL)//判断两个链表是否相交while(longList && shortList){if(longList == shortList){//链表相交return longList;}//两个指针继续往后走longList = longList->next;shortList = shortList->next;}//链表不相交return NULL;
}struct ListNode *detectCycle(struct ListNode *head) 
{ListNode* slow = head;ListNode* fast = head;while(fast && fast->next){slow = slow->next;fast = fast->next->next;if(slow == fast){//有环ListNode* meet = slow;//相遇点ListNode* newHead = meet->next;meet->next = NULL;return getIntersectionNode(head, newHead); }}return NULL;//无环
}

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

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

相关文章

考研党暑假回家还是留校,暑假回家就一定完蛋吗?

考研我建议最好还是留校,因为环境比较好! 并不是说回家复习就一定不好,回家要面临三大“敌人”: 1、我们本身的惰性,这个无需多言,在自己熟悉的环境,自己一个人,手机电脑网络零食俱…

python条件

条件语句 if语句 if...else语句 if...elif...else语句 嵌套 is is 是一个身份运算符,用于比较两个对象的身份,即它们在内存中的地址是否相同。这与比较两个对象是否相等的 运算符不同。 运算符比较的是两个对象的值是否相等。 比较对象 比较基本数据…

【Unity】RPG2D龙城纷争(十一)战斗系统之回合制驱动

更新日期:2024年7月11日。 项目源码:第五章发布(正式开始游戏逻辑的章节) 索引 简介一、开始关卡二、进入指定回合三、玩家结束当前回合四、进入下一回合五、通关条件六、检测关卡状态简介 通过前两篇的工作,我们的角色已经能够进行移动、战斗了,此刻,便进入第三个板块…

React基础学习-Day04

React基础学习-Day04 常见的钩子函数及基础使用方式 1.useState useState 是 React 的一个 Hook,用于在函数组件中添加状态。它返回一个状态变量和一个更新该状态的函数。与类组件的 this.state 和 this.setState 相对应,useState 让函数组件也能拥有…

存储实验:Linux挂载iscsi硬盘与华为OceanStor创建LUN全流程

目录 目的环境规划实验实验流程Centos配置0. 关闭防火墙1. 设置网卡信息2. 配置路由3. iscsiadm连接存储 iSCSI LUN创建(以华为OceanStor为例)验证1. 验证是否成功2. 开启自动挂载 目的 实现Linux连接iscsi硬盘,同时实现开机自启挂载 环境规…

掌握本地仓储:Gradle本地仓库配置全指南

掌握本地仓储:Gradle本地仓库配置全指南 在构建自动化的领域中,Gradle以其灵活性和强大的依赖管理功能脱颖而出。管理项目依赖时,经常需要配置本地仓库以优化构建速度、控制依赖版本或支持离线构建。本文将深入探讨如何在Gradle中配置本地仓…

JAVA----泛型

泛型 认识泛型 定义类、接口、方法时,同时声明了一个或者多个类型变量(如:) ,称为泛型类、泛型接口,泛型方法、它们统称为泛型。 作用:利用泛型,可以限制集合存储数据的类型. 泛型…

Gitee简易使用流程(后期优化)

目录 1.修改用户名 2.文件管理 新建文件/文件夹流程如下: 上传文件流程如下: 以主页界面为起点 1.修改用户名 点解右上角的头像--> 点击“账号设置” 点击左边栏里的“个人资料“ 直接修改用户名即可 2.文件管理 选择一个有修改权限仓库&#…

【从0到1进阶Redis】主从复制

笔记内容来自B站博主《遇见狂神说》:Redis视频链接 1、概念 主从复制,是指将一个台 Redis 服务器的数据,复制到其他的 Redis 服务器。前者称为主节点(master/leader),后者称为从节点(slave/foll…

this指向解析

先看题目: 第一题: var name window var person1 { name: person1, show1: function () { console.log(this.name) }, show2: () > console.log(th show3: function () { return function () { …

MFC之对话框--重绘元文件

文章目录 实现示例展示需要绘制的窗口/位置控件位置更新下一次示例粗细滑动部分更新 重绘元文件(窗口变化内容消失)方法一:使用元文件方法二:兼容设备方法三:使用自定义类存储绘图数据除画笔外功能处理画笔功能处理 保…

springmvc1

以前的servlet程序: springmvc 不同的处理器:不同的方法或者处理类 所有的请求都会经过dispathcherservlet的doservice方法: mvc原理: 前端控制器:jsp或者什么东西

Python字符串基础与高级操作

在Python中,字符串是不可变的数据类型,用于存储一系列的字符。它们可以被创建、访问、操作和格式化,但一旦创建,其内容就不能改变。下面是一篇关于Python字符串技术的详细讲解,包括创建、访问、更新、转义、运算符、格…

Phpstudy 2018 之xhcms搭建

1、由于直接访问根目录无法进入网站 2、所以采用搭建网站,第一使用系统服务模式、选择php-5.4.45Apache模式 3、网站域名为本地ip地址或者127.0.0.1、端口8085 4、在navicat创建名字为xjcms的数据库,并导入sql数据库文件 5、浏览器输入127.0.0.1:8085直接…

中风伤寒、感冒、六经辨证笔记

目录 基础传经的原因传经的过程及速度传经的危害感冒时体痛头痛的原因根据头痛的位置辨经 太阳病太阳中风外风内热 表虚感冒颗粒(桂枝葛根汤) 少阳病辨病总结伤寒论原文半表半里太阳为开,阳明为阖,少阳为枢胆的作用帮助肠胃消化、…

deepstream读取mp4文件及不同类型视频输入bug解决

在deepstream中使用mp4文件,与rtsp类似,使用uridecodebin即可,(可见官方test.py文件) def create_source_bin(index, uri):print("Creating source bin")# Create a source GstBin to abstract this bins c…

定投投什么?

定投可以选择的品种有银行理财和基金 银行理财目前有的品种有期限限制,不是那么公开的特点。如果说你想通过定投积累一笔低风险的,用于应急或者短期内要用的钱,可以选择定投现金类银行理财。 基金是最适合定投的产品, 基金分为…

【自然语言处理】面向新冠肺炎的社会计算应用

面向新冠肺炎的社会计算应用 1 任务目标 1.1 案例简介 新冠肺炎疫情牵动着我们每一个人的心,在这个案例中,我们将尝试用社会计算的方法对疫情相关的新闻和谣言进行分析,助力疫情信息研究。本次作业为开放性作业,我们提供了疫情…

C++ STL stable_sort用法

一&#xff1a;功能 对区间内元素进行排序&#xff0c;保证相等元素的顺序&#xff08;稳定排序&#xff09; 二&#xff1a;用法 #include <iostream>struct Record {std::string label;int rank; };int main() {std::vector<Record> data {{"q", 1},…

代码随想录第五十一天 | 300.最长递增子序列 , 674. 最长连续递增序列 , 718. 最长重复子数组

300.最长递增子序列 看完想法&#xff1a;在dp递推公式那里没有太看得懂。首先dp【i】的状态肯定是由前面的dp【0】到dp【i-1】推出的&#xff0c;但是dp【0】到dp【i-1】可以推出dp【i】有个前提就是(nums【i】 > nums【0到i-1任意一个】),例如nums【1】 2, nums【3】 5…