leetcode刷题日记:160. Intersection of Two Linked Lists(相交链表)

给出两个单链表的头结点headA与headB,让我们找出两个链表相接的起始节点,如果两个链表不存在相交结点返回null。
我们就先假设存在这样两个链表,链表1与链表2,假设链表1的长度为 L 1 L_1 L1 L 2 L_2 L2,假设对于两个链表,从相交的结点向后数长度为 L 1 , 2 L_{1,2} L1,2,则在相交结点之前链表1的长度未 L 1 − L 1 , 2 L_1-L_{1, 2} L1L1,2链表2的长度为 L 2 − L 1 , 2 L_2- L_{1, 2} L2L1,2,对于两条链表无相交的情况 L 1 , 2 = 0 L_{1,2}=0 L1,2=0,如图是具有相交部分的两个链表的图示:
在这里插入图片描述
不相交的两个链表的图示你可以想象出来,将后面的那一部分去掉就行了。
我们现在想的就是如何让遍历链表1的指针与遍历链表2的指针能够相遇在同一节点,如图所示:
在这里插入图片描述
显然这两个链表在相交部分前面的部分可能不一样长也就是 L 1 ≠ L 2 L_1\neq L_2 L1=L2,也就是我们我们直接从头结点遍历遍历到尾结点是不行的,我们们来看一下遍历到尾节点之后链表1走了多远 ( L 1 − L 1 , 2 ) + L 1 , 2 (L_1-L_{1,2})+L_{1,2} (L1L1,2)+L1,2链表2走过的长度为 ( L 2 − L 1 , 2 ) + L 1 , 2 (L_2-L_{1,2})+L_{1,2} (L2L1,2)+L1,2是不是我们可以看出有一段是公共的长度,它们两个走过的长度不一样就不一样在 ( L 1 − L 1 , 2 ) (L_1-L_{1,2}) (L1L1,2) ( L 2 − L 1 , 2 ) (L_2-L_{1,2}) (L2L1,2)这两项上,如果说在链表1走过的路程加上一个 ( L 2 − L 1 , 2 ) (L_2-L_{1,2}) (L2L1,2),在链表2走过的路程加上一个 ( L 1 − L 1 , 2 ) (L_1-L_{1,2}) (L1L1,2),它们是不是就一样了,都为 ( L 1 − L 1 , 2 ) + L 1 , 2 + ( L 2 − L 1 , 2 ) (L_1-L_{1,2})+L_{1,2}+(L_2-L_{1,2}) (L1L1,2)+L1,2+(L2L1,2)
我们整理一下:
链表1走过的路程为: { ( L 1 − L 1 , 2 ) + L 1 , 2 } + ( L 2 − L 1 , 2 ) \{(L_1-L_{1,2})+L_{1,2}\}+(L_2-L_{1,2}) {(L1L1,2)+L1,2}+(L2L1,2)
链表2走过的路程为: ( L 1 − L 1 , 2 ) + { ( L 1 , 2 ) + ( L 2 − L 1 , 2 ) } (L_1-L_{1,2})+\{(L_{1,2})+(L_2-L_{1,2})\} (L1L1,2)+{(L1,2)+(L2L1,2)}
在这两个式子中,我们发现{}所围的为自己链表的长度,其余的为对方链表的在相交之前的部分的长度。也就是说如果我们遍历自身链表,到结尾之后再去遍历对方链表就能让两个指针同步。
两个指针同步之后,如果在同步之后后面仍有结点,则说明有相交部分,如果同步之后后面没有结点了,则说明这两个链表之间没有相交部分。
有了上面的思路,我们可以写出下面的代码:

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    struct ListNode *p=headA, *q=headB;
    while(p!=q){
        if(p==NULL){
            p = headB;
        }else{
            p = p->next;
        }
        if(q==NULL){
            q = headA;
        }else{
            q = q->next;
        }
    }
    return p;
}

而且程序的时间复杂度为 O ( n + m ) O(n+m) O(n+m)空间复杂度为 O ( 1 ) O(1) O(1)
程序运行结果:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MatrixOne完成与欧拉、麒麟信安的兼容互认

近日,超融合异构云原生数据库MatrixOne企业版软件V1.0完成了与欧拉开源操作系统(openEuler简称“欧拉”)、麒麟信安操作系统系列产品和虚拟化平台的相互兼容认证,通过了欧拉兼容性测评,获得了《openEuler技术测评证书》…

JS进阶——作用域、解构、箭头函数

1、作用域 作用域(scope)规定了变量能够被访问的“范围”,离开了这个“范围”变量便不能被访问。 1.1 局部作用域 局部作用域可分为函数作用域和块作用域。 1.1.1 函数作用域 在函数内部声明的变量只能在函数内部被访问,外部无…

Linux C 线程

线程 概述线程和进程的异同如何选择使用进程还是线程 函数获取进程自身ID  pthread_self创建线程  pthread_create退出线程  pthread_exit线程等待  pthread_join 四种线程模型1 )单线程2 )单线程3 )双线程4 )三线程 概述…

【实习】modbus

介绍 详解Modbus通信协议—清晰易懂 Modbus协议是一个master/slave架构的协议。有一个节点是master节点,其他使用Modbus协议参与通信的节点是slave节点。每一个slave设备都有一个唯一的地址。在串行和MB网络中,只有被指定为主节点的节点可以启动一个命令…

探索 AI 算法与链上资产,ForthTech 如何提供稳健交易策略

从传统股票、期货市场发家,ForthTech 如何找到了 AI 赋能下数字资产交易策略与保值增值的技术路径?面对变幻不居的 Web3 行业,如何才能更好地应对市场波动,找到基建设施、资金管理、技术工具的优化方向,给用户更加安全…

QT自定义信号,信号emit,信号参数注册

qt如何自定义信号 使用signals声明返回值是void在需要发送信号的地方使用 emit 信号名字(参数)进行发送 在需要链接的地方使用connect进行链接 ct进行链接

LeetCode - 141. 环形链表 (C语言,快慢指针,配图)

目录 1. 什么是快慢指针 2. 非环形链表 3.代码展示 4.扩展:fast走3步,slow走一步呢? 1. 什么是快慢指针 这里我们我们将介绍环形链表的经典解法——快慢指针,简单理解,指针移动快的叫做快指针fast,移动…

汽车 CAN\CANFD数据记录仪

CAN FD数据记录仪解决汽车电子数据记录与偶发性故障查找问题。 1、脱机离线记录两路CAN/CANFD通道数据 脱机离线记录两路CAN/CANFD通道数据,可记录6个月数据。每个通 道单独设置触发记录模式、触发前预记录报文个数(默认1000帧)及 过滤规则&a…

NetApp E5700 系列混合闪存存储系统,将企业应用程序的性能提升到极致

主要优势 优势1、卓越的性能 • 利用最适合现代企业级应用(例如,大数据分析、技术计算、视频监控以及备份和恢复)的混合系统提高性能、IOPS 和密度。 优势2、无与伦比的价值 • 利用三个不同的磁盘系统架、多种驱动器类型和一套齐备的 SAN …

KT148A语音芯片使用串口uart本控制的完整说明_包含硬件和指令举例

一、功能简介 KT148A肯定是支持串口的,有客户反馈使用一线还是不方便,比如一些大型的系统不适合有延时的操作,所以更加倾向于使用uart控制,这里我们也给出解决方案 延伸出来另外一个版本,KT158A 注意次版本芯片还是…

教育数字化助力打造个性化语言学习环境

2023年,我国教育数字化呈现高速发展态势,网络教育用户规模、在线教育市场规模、数字内容市场规模再创历史新高,数字校园建设普及率、教师数字技术素养等均高于全球平均水平。 在数字技术支撑下,新的语言学习方式也在逐渐普及。 语言学家克拉申(Stephen Kr-ashen)提出的二语习得…

解决Web端请求响应超时HTTP状态码504和110 timed out错误(Nginx配置调整)

前言 在前端开发中,发送请求时,有时会遇到请求响应超时的问题(如 HTTP 状态码504 和 110错误)。这种问题可能是由于网络延迟、服务器响应时间过长或请求数据量过大等原因造成的。为了解决这个问题,我们可以通过配置 N…

python科研绘图:带正态分布的直方图

带正态分布的直方图是一种用直方图表示数据分布的图表,其中数据经过了正态分布的拟合。正态分布是一种常见的概率分布,具有平均值和标准差。在带正态分布的直方图中,数据被分成不同的区间,每个区间的频数或频率可以用颜色或标签表…

配电室中如何安装六氟化硫SF6气体泄漏报警装置?

六氟化硫气体泄漏报警装置安装位置产品的设计、检验、制造均遵循GB16808-2008《可燃气体报警控制器》和GB12358-2006《作业场所环境气体检测报警仪通用技术要求》严格设计。是经过高速CPU数据处理,通过LCD显示出探测器的浓度、状态并输出相应的控制信号。报警控制器…

恶意软件之系统病毒

病毒是迄今为止最常见的恶意软件类型之一。它是一种能够感染、破坏计算机设备,并在其运行系统上自我复制的程序。由于病毒是自我复制的,一旦安装并运行,它们就可以在同一网络上自动从一台设备传播到另一台设备,无需人为干预。病毒…

熬夜整理的Figma插件合集分享,快码住!

越来越多的设计师逐渐从用Sketch转变为用Figma做设计。相比起Sketch,Figma的基本功能上确实很厉害,但是他比较缺乏的一个东西就是没有很多丰富实用的插件支持。目前Figma作为一个快速发展的平台,逐渐搭建起了自己的辅助插件系统。如果你已经准…

vue+springboot实现图形验证码Kaptcha

1、前端 form使用了element-ui的组件&#xff0c;主要还是看img标签&#xff0c;src绑定了form.imgCodeUrl数据&#xff0c;点击图片时触发refreshCode更新图片验证码。 <el-form-item prop"verificationCode" label"验证码" style"text-align: l…

【informer】 时间序列的预测学习 2021 AAAI best paper

文章目录 前言1.引入2.数据集3. 训练4其它【待续】 前言 数据集 https://github.com/zhouhaoyi/ETDataset/blob/main/README_CN.md 代码&#xff1a;https://github.com/zhouhaoyi/Informer2020#reproducibility 21年的paper:https://arxiv.org/pdf/2012.07436.pdf 论文在代码…

1. redis入门到放弃

使用shutdown命令的时候&#xff0c;会在关机的同时生成一个RDB文件&#xff0c;使数据不丢失。redis虽然有16个库&#xff0c;但是基本上只会用0库&#xff0c;用其他的库没有意义。集群只能在0号库做mysql的读写&#xff0c;大约为写入600笔/s,读2000笔/s 一、Redis全局命令…

AI变现之数字人工具库账号引流

信息差无处不在&#xff0c;AI 发展到今天虽然工具和技术都日趋成熟&#xff0c;但是在国内普及率还不是很高&#xff0c;对于很多普通人估计也就听过 Chatgpt&#xff0c;MJ&#xff0c;SD 等 AI 工具的名词&#xff0c;但是没有真正的使用过&#xff0c;而使用 AI 数字人制作…