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

链表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 是一个身份运算符,用于比较两个对象的身份,即它们在内存中的地址是否相同。这与比较两个对象是否相等的 运算符不同。 运算符比较的是两个对象的值是否相等。 比较对象 比较基本数据…

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硬盘,同时实现开机自启挂载 环境规…

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

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

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

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

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

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

springmvc1

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

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直接…

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

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

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

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

Tomcat下载安装配置教程(零基础超详细)

「作者简介」:冬奥会网络安全中国代表队,CSDN Top100,就职奇安信多年,以实战工作为基础著作 《网络安全自学教程》,适合基础薄弱的同学系统化的学习网络安全,用最短的时间掌握最核心的技术。 Tomcat 1、下载…

外包干了1个月,技术明显退步。。。

有一种打工人的羡慕,叫做“大厂”。 真是年少不知大厂香,错把青春插稻秧。 但是,在深圳有一群比大厂员工更庞大的群体,他们顶着大厂的“名”,做着大厂的工作,还可以享受大厂的伙食,却没有大厂…

【轻松拿捏 】Java-static关键字(面试)

Java-static关键字 1. 定义和基本概念 回答要点: 示例回答: 2. static 变量 回答要点: 示例回答: 代码示例: 3. static方法 回答要点: 示例回答: 代码示例: 4. static 代…

Modbus协议简介与Python实现

Modbus协议是工业自动化和控制系统中广泛使用的通信协议。自1979年由Modicon(现为施耐德电气的一部分)引入以来,它已经成为一种标准的通信协议,用于连接电子设备和传感器。Modbus协议基于主从架构,支持多种物理层和传输模式,如串行通信(RS-232/RS-485)和以太网。 1. Mo…

STM32智能交通监测系统教程

目录 引言环境准备智能交通监测系统基础代码实现:实现智能交通监测系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景:交通监测与管理问题解决方案与优化收尾与总结 1. 引言 智能交通监测系统通…

Linux--线程池(包含日志的解释)

线程系列: Linux–线程的认识(一) Linux–线程的分离、线程库的地址关系的理解、线程的简单封装(二) 线程的互斥:临界资源只能在同一时间被一个线程使用 生产消费模型 信号量 线程池 线程池(Thread Pool)是…

Qt 统计图编程

学习目标:Qt 折线图,柱形图和扇形统计图编程 学习基础 Qt QChart 曲线图表操作-CSDN博客 学习内容 Qt中绘制三种常见的图表非常方便, 主要步骤如下: 1. 折线图: - 使用QLineSeries定义折线数据,添加多个坐标点 - 使用QValueAxis创建X轴和Y轴 - 将…

拷贝文件的一些操作

利用fputc 、fgetc实现文件的拷贝 int main(int argc, const char *argv[]) {FILE* rfpfopen(argv[1],"r");FILE* wfpfopen(argv[2],"w");if(rfpNULL || wfpNULL){perror("fopen");return 1;}while(1){char resfgetc(rfp);if(feof(rfp)1){break;…

PointCloudLib LocalMaximum_DeleteMaxPoint C++版本

测试效果 简介 在点云库(Point Cloud Library,PCL)中,处理点云数据时,经常需要去除局部最大点(Local Maximum),这通常用于去除噪声、提取特定形状的特征或者简化点云数据。局部最大…