[C/C++] 数据结构 链表OJ题:相交链表(寻找两个链表的相交起始结点)

题目描述:

        

        给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。

图示两个链表在节点 c1 开始相交

题目数据 保证 整个链式结构中不存在环。

注意,函数返回结果后,链表必须 保持其原始结构 。

解题思路:

        首先我们得明白,单链表只有一个next指针,如果两个单链表相交,那从相交结点开始,两链表完全相同,所以相交链表一定是Y字型的,不可能出现X型.,并且如果两链表最后一个结点不相同,则两链表一定不相交.

        思路1:(暴力求解):

        依次取第一个链表的一个结点与第二个链表的全部结点相比较(这里要注意比较的是结点的地址),若找到地址相同的结点,那么该结点就是相交结点,若遍历完第一个链表还没有找到,则表示两链表没有相交,其时间复杂度为O(n^2)

        思路二:

        如果相交链表是上如所示形状,那便可以取第一个链表的第一个结点与第二个链表的第一个结点比较,若不相同,继续比较两链表的第二个几点,直到找到相交结点.这样就可以把时间复杂度控制到O(n),这种方法虽然有效,但是碰到下图所示情况就没办法用了:

       

        思考一下,如果两个链表相交的话,假设第一个链表在相交结点前有n个结点,第二个链表在相交结点前有m个结点,(假设n>m),那么第一个链表的前n-m个结点肯定不是相交结点.

所以就可以分别遍历两个链表并求出其长度,让较长的链表先走两链表长度的差值步,使两链表相交结点前的结点数相同,这样就可以用上面讲的思路了.


这里有两个小细节:

  1. 在求两链表的长度时,遍历链表的条件为 while(cur->next != NULL),这样遍历完成时cur指针指向的就是链表的最后一个结点,虽然这样写会导致求出来的链表长度少了1个结点,但是我们求两个链表的长度是为了知道其长度差,而两个链表长度都少1并不会影响结果
  2. 由于我们并不知道两个链表谁长谁短,可以使用 if 语句判断,如果第一个链表长就让第一个链表先走,如果第二个链表长就让第二个链表先走,但是这样写会有很多代码重复.这种情况就可以使用假设法,定义一个longlist指针和一个shortlist指针,我们先让longlist指向第一个链表,short指向第二个链表,我们在判断第一个链表的长度是否大于第二个链表的长度,如果不是,则让longlist指向第二个链表,shortlst指向第一个链表,这样longlist一定指向的是长度较长的链表,short一定指向的是长度较短的链表,后续我们只要操作longlist和shortlist就好了

参考代码:


struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {struct ListNode *curA=headA;struct ListNode *curB=headB;int lenA=0;int lenB=0;while(curA->next){lenA++;curA=curA->next;}while(curB->next){lenB++;curB=curB->next;}if(curA!=curB)return NULL;//假设长的链表为Astruct ListNode *longlist=headA;struct ListNode *shortlist=headB;if(lenA<lenB){longlist=headB;shortlist=headA;}int n=abs(lenA-lenB);//先让长链表先走while(n--){longlist=longlist->next;}//两个链表同时走找相交结点while(longlist!=shortlist){longlist=longlist->next;shortlist=shortlist->next;}return longlist;//return shortlist;
}

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

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

相关文章

HTML简单介绍

且视他人之疑目如盏盏鬼火&#xff0c;大胆地去你的夜路。 目录 1.网页 2.Web标准 3.HTML 3.1HTML结构 3.2HTML标签​编辑 4.标签介绍 4.1排版标签 4.2文本格式化标签 4.3媒体标签 4.3.1图片标签 4.3.2 音频标签 4.3.3视频标签 5.相对路径 6.链接标签 6.1target属…

爬取动态网页内容的库

爬取动态网页内容时&#xff0c;传统的 Python 爬虫库&#xff08;如 Requests、BeautifulSoup&#xff09;可能无法直接获取 JavaScript 动态生成的内容。为了处理这种情况&#xff0c;你可以使用一些特别设计的库&#xff0c;它们能够模拟浏览器行为&#xff0c;执行 JavaScr…

图论15-有向图-环检测+度数+欧拉回路

文章目录 1. 有向图设计1.1 私有变量标记是否有向1.2 添加边的处理&#xff0c;双向变单向1.3 删除边的处理&#xff0c;双向变单向1.4 有向图的出度和入度 2 有向图的环检测2.1 普通的算法实现换检测2.2 拓扑排序中的环检测 3 欧拉回路 1. 有向图设计 1.1 私有变量标记是否有…

燃气管网监测系统|全面保障燃气安全

根据新华日报的报道&#xff0c;2023年上半年&#xff0c;我国共发生了294起燃气事故&#xff0c;造成了57人死亡和190人受伤&#xff0c;燃气事故的发生原因有很多&#xff0c;其中涉及到燃气泄漏、设备故障等因素。因此&#xff0c;加强燃气安全管理&#xff0c;提高城市的安…

在 Kubernetes 上运行 Elasticsearch

Kubernetes&#xff08;快速&#xff09;入门 Kubernetes 是一种容器编排技术&#xff0c;这只是一种奇特的说法&#xff0c;它可以帮助您管理和运行打包的应用程序。它基本上看起来像这样&#xff1a; 库伯内特斯架构 Kubernetes 基本架构 您的应用程序&#xff08;例如博客软…

vue、react中虚拟的dom

React中虚拟DOM的例子&#xff1a; 下面是一个使用React创建的简单的计数器组件&#xff1a; import React, { Component } from react;class Counter extends Component {constructor(props) {super(props);this.state {count: 0};}handleClick () > {this.setState({c…

httpClient超时时间详解与测试案例

使用httpclient作为http请求的客户端时&#xff0c;我们一般都会设置超时时间&#xff0c;这样就可以避免因为接口长时间无响应或者建立连接耗时比较久导致自己的系统崩溃。通常它里面设置的几个超时时间如下&#xff1a; RequestConfig config RequestConfig.custom().setCo…

电磁场与电磁波part1--矢量分析

目录 1、方向导数 2、散度定理&#xff08;高斯定理&#xff09; 3、散度与旋度的比较 4、旋度定理&#xff08;斯托克斯定理&#xff09; 5、关于点乘、叉乘、梯度、散度、旋度的计算 ~~~~~~~~~~~~~~~~~~~~~~~~ 确认过眼神&#xff0c;是我看不懂的 ~~~~~~~~~~~~~~~~…

IDEA没有Add Framework Support解决办法

点击File—>Settings 点击第一个设置快捷键 点击apply和ok即可 我们要点击一下项目&#xff0c;再按快捷键ctrlk 即可

C++入门(2)—函数重载、引用

目录 一、函数重载 1、参数类型不同 2、参数个数不同 3、参数顺序不同 4、 链接中如何区分函数重载 二、引用 1、规则 2、特征 3、使用场景 做参数 做返回值 4、常引用 5、传值、传引用效率比较 6、引用和指针的区别 接上一小节C入门(1)—命名空间、缺省参数 一…

Python 如何实现适配器设计模式?什么是适配器(Adapter)设计模式?

什么是适配器设计模式&#xff1f; 适配器&#xff08;Adapter&#xff09;设计模式是一种结构型设计模式&#xff0c;它允许接口不兼容的类之间进行合作。适配器模式充当两个不兼容接口之间的桥梁&#xff0c;使得它们可以一起工作&#xff0c;而无需修改它们的源代码。 主要…

JXLS 导出多sheet,带页眉页脚

/*** 生成多sheet Excel* 带自定义页眉页脚** param templatePath* param sheetList* return* throws IOException*/public static byte[] generateMultiSheet(String templatePath, List<JxlsHelper2.SheetContext> sheetList) throws IOException {ByteArrayOutputStre…

C++ 基础

准备工具Vscode或者Clion或者Dev C或者Vs studio 和 MSYS2 是C跨平台的重要工具链. 基础一 准备工作安装MSYS2软件 创建文件 一、基本介绍1.1C源文件1.2 代码注释1.3变量与常量1.3.1变量1.3.2 常量1.3.3 二者的区别&#xff1a; 1.4 关键字和标识符 二、数据类型2.1 基本数据类…

Flink CDC

1、Flink CDC的介绍&#xff1a; 是一种技术&#xff0c;可以帮助我们实时的捕获数据库中数据的变化&#xff0c;并将这些变化的数据以流的形式传输到其他的系统中进行处理和存储。 2、Flink CDC的搭建&#xff1a; 1、开启mysql的binlog功能&#xff1a; # 1、修改mysql配置…

C/C++ 实现获取硬盘序列号

获取硬盘的序列号、型号和固件版本号&#xff0c;此类功能通常用于做硬盘绑定或硬件验证操作&#xff0c;通过使用Windows API的DeviceIoControl函数与物理硬盘驱动程序进行通信&#xff0c;发送ATA命令来获取硬盘的信息。 以下是该程序的主要功能和流程&#xff1a; 定义常量…

2023版Idea创建JavaWeb时,右键new没有Servlet快捷键选项

问题&#xff1a;右键时&#xff0c;没有创建servlet的快捷键&#xff0c;如下图&#xff1a; 解决方法&#xff1a; 1.打开idea&#xff0c;点击File>settings(设置)&#xff0c;进入settings页面&#xff0c;如下 从上图中的Files选项中没看到有servlet选项&#xff0c;…

2023NOIP A层联测32

2023NOIP A层联测32 文章目录 2023NOIP A层联测32A flandreB.meirinC.sakuyaD. 红楼 ~ Eastern Dream总结 A flandre 有 n n n 种烟花&#xff0c;每种烟花有两个参数 a &#xff0c; b a &#xff0c; b a&#xff0c;b&#xff0c;你要构造一种燃放顺序&#xff0c;使得 …

正则表达式入门教程

一、本文目标 让你明白正则表达式是什么&#xff0c;并对它有一些基本的了解&#xff0c;让你可以在自己的程序或网页里使用它。 二、如何使用本教程 文本格式约定&#xff1a;专业术语 元字符/语法格式 正则表达式 正则表达式中的一部分(用于分析) 对其进行匹配的源字符串 …

Rancher 容器中使用 jmap 工具导出内存日志

提升容器权限 编辑容器工作负载&#xff0c;在【安全/主机设置】中选中【特权模式】的【是&#xff1a;容器具有所有主机访问权限】 进入容器命令行&#xff0c;执行 jmap 命令 # 获取服务 pid ps -ef | grep java # 执行 jmap 导出内存日志 jmap -dump:live,formatb,file/hom…

线程锁的应用与示例代码

为了解决这个问题&#xff0c;可以使用线程锁来确保在提取zip文件中的每个文件时&#xff0c;同一时间只有一个线程可以访问文件。这样可以避免多个线程同时访问和写入文件&#xff0c;从而解决race condition的问题。以下是修改后的示例代码&#xff1a; python import reque…