相交链表(LeetCode 160)

news2025/1/24 5:33:00

文章目录

  • 1.问题描述
  • 2.难度等级
  • 3.热门指数
  • 4.解题思路
    • 方法一:暴力法
    • 方法二:哈希表
    • 方法三:双栈
    • 方法四:双指针:记录链表长度
    • 方法五:双指针:互换遍历
  • 5.实现示例
  • 参考文献

1.问题描述

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

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

在这里插入图片描述
题目数据 保证 整个链式结构中不存在环。

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

示例 1:
在这里插入图片描述
相交返回结点 8。

示例 2:
在这里插入图片描述
相交返回结点 2。

示例 3:
在这里插入图片描述
不相交返回 null。

进阶: 你能否设计一个时间复杂度 O(m + n) 、仅用 O(1) 内存的解决方案?

2.难度等级

Easy。

3.热门指数

★★★★★

出题公司:阿里、腾讯、字节。

4.解题思路

解这道题之前,我们需要首先明确一个概念:何为相交?

相交指的是结点为同一个结点,那么指向结点的指针是相同的,而不是第一个结点值相同。

如果不考虑时间和空间复杂度,那么有多种解法。

假设 m 和 n 是分别是链表 headA 和 headB 的长度。

方法一:暴力法

从头开始遍历第一个链表,遍历第一个链表的每个节点时,同时从头到尾遍历第二个链表,看是否有相同的节点,第一次找到相同的节点即第一个交点。

若第一个链表遍历结束后,还未找到相同的节点,即不存在交点。

时间复杂度: O ( n 2 ) O(n^2) O(n2)

空间复杂度: O ( 1 ) O(1) O(1)

方法二:哈希表

判断两个链表是否相交,可以使用哈希集合存储链表节点。

首先遍历链表 headA,将链表中的每个节点加入哈希表中。然后遍历链表 headB,判断节点是否在哈希表中。

如果链表 headB 中的所有节点都不在哈希集合中,则两个链表不相交,返回 null。

时间复杂度: O(m+n),需要遍历两个链表各一次。

空间复杂度: O(m),需要使用哈希表存储链表 headA 的全部节点。

方法三:双栈

我们可以从头遍历两个链表。创建两个栈,第一个栈存储第一个链表的节点,第二个栈存储第二个链表的节点。每遍历到一个节点时,就将该节点入栈。两个链表都入栈结束后。

则通过判断栈顶的节点是否相等即可判断两个单链表是否相交。因为我们知道,若两个链表相交,则从第一个相交节点开始,后面的节点都相交。

若两链表相交,则循环出栈,直到遇到两个出栈的节点不相同,则这个节点的后一个节点就是第一个相交的节点。

时间复杂度: O(m+n)。需要遍历两个链表各两次,一次是入栈,一次是出栈。

空间复杂度: O(m+n),需要使用两个栈存储链表 headA 和 headB 的所有结点。

方法四:双指针:记录链表长度

同时遍历两个链表到尾部,同时记录两个链表的长度。若两个链表最后的一个节点相同,则两个链表相交。

有两个链表的长度后,我们就可以知道哪个链表长,设较长的链表长度为 len1,短的链表长度为 len2。

则先让较长的链表向后移动 len1-len2 个长度。然后开始从当前位置同时遍历两个链表,当遍历到的链表的节点相同时,则这个节点就是第一个相交的节点。

时间复杂度: O ( m + n ) O(m+n) O(m+n),两个指针同时遍历两个链表,然后再遍历两个链表至相同结点。

空间复杂度: O ( 1 ) O(1) O(1)

方法五:双指针:互换遍历

当链表 headA 和 headB 都不为空时,创建两个指针 pA 和 pB,初始时分别指向两个链表的头节点 headA 和 headB,然后将两个指针依次遍历两个链表的每个节点。具体做法如下:

  • 每步操作需要同时更新指针 pA 和 pB。

  • 如果指针 pA 不为空,则将指针 pA 移到下一个节点;如果指针 pB 不为空,则将指针 pB 移到下一个节点。

  • 如果指针 pA 为空,则将指针 pA 移到链表 headB 的头节点;如果指针 pB 为空,则将指针 pB 移到链表 headA 的头节点。

  • 当指针 pA 和 pB 指向同一个节点或者都为空时,返回它们指向的节点或者 null。

为什么第一次遍历完后互换从头遍历后,如果相交会同时到达相交结点呢?

假设下面是一个相交的两个链表,省去了结点。其中链表 headA 的长度为 a + c = m,链表 headB 的长度为 b + c = n。

在这里插入图片描述

因为 a + c + b 等于 b + c + a,所以第一次遍历完后互换从头遍历,会同时到达相交结点。

如果两个链表不相交,也会同时到达尾结点,因为 m + n 等于 n + m。

时间复杂度: O ( m + n ) O(m+n) O(m+n),两个指针同时遍历两个链表,然后再遍历两个链表至相同结点。

空间复杂度: O ( 1 ) O(1) O(1)

5.实现示例

面以 Golang 为例,给出「双指针:互换遍历」的实现。

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func getIntersectionNode(headA, headB *ListNode) *ListNode {
    pA, pB := headA, headB
    for pA != nil || pB != nil {
        if pA == pB {
            return pA
        }
        if pA == nil {
            pA = headB
        } else {
            pA = pA.Next
        }
        if pB == nil {
            pB = headA
        } else {
            pB = pB.Next
        }     
    }
    return nil
}

参考文献

160. 相交链表 - LeetCode
判断两个单链表是否相交及找到第一个交点原创 -CSDN

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

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

相关文章

ai智能客服的发展是怎么样的?

随着科技的不断发展,人工智能(AI)技术已经逐渐进入了我们的生活,其中最为突出的应用之一就是智能客服。智能客服是指利用人工智能技术来实现客户服务的一种方式,它可以通过自然语言处理、机器学习等技术,来…

go语言 | etcd源码导读(一)

参考 本文参考https://zhuanlan.zhihu.com/p/600893553 https://www.topgoer.com/%E6%95%B0%E6%8D%AE%E5%BA%93%E6%93%8D%E4%BD%9C/go%E6%93%8D%E4%BD%9Cetcd/etcd%E4%BB%8B%E7%BB%8D.html 前沿etcd 与 raft etcd是使用Go语言开发的一个开源的、高可用的分布式key-value存储系…

【MySQL数据类型】

目录: 前言数据类型分类整数类型tinyintbit 小数类型floatdecimal 字符串类型charvarchar日期和时间enum & set在集合中查找find_in_set 前言 剑指offer:一年又4天 数据类型分类 整数类型 tinyint 整数类型都分为有符号和无符号两种,默…

【7】PyQt布局layout

目录 1. 布局简介 2. 水平布局QHBoxLayout 3. 竖直布局QVBoxLayout 4. 表单布局QFormLayout 5. 布局嵌套 1. 布局简介 一个pyqt窗口中可以有多个控件。所谓布局,指的就是多个控件在窗口中的展示方式 布局方式大致分为: 水平布局竖直布局网格布局表单布局 2. 水平布局Q…

zookeeper集群 +kafka集群

1.zookeeper kafka3.0之前依赖于zookeeper zookeeper是一个开源,分布式的架构,提供协调服务(Apache项目) 基于观察者模式涉及的分布式服务管理架构 存储和管理数据,分布式节点上的服务接受观察者的注册&#xff0c…

【EI会议征稿中,IEEE出版】第三届计算机科学、电子信息工程和智能控制技术国际会议(CEI 2023)

第三届计算机科学、电子信息工程和智能控制技术国际会议(CEI 2023) 2023 3rd International Conference on Computer Science, Electronic Information Engineering and Intelligent Control Technology 第三届计算机科学、电子信息工程和智能控制技术…

Auto4D:从时序点云标注4D物体

文章:Auto4D: Learning to Label 4D Objects from Sequential Point Clouds 作者:Bin Yang, Min Bai, Ming Liang, Wenyuan Zeng, Raquel Urtasun 编辑:点云PCL 来源:arXiv 2021 …

180天Java从入门到就业-Day04-01Java程序流程控制介绍、Java分支结构if语句

1.程序流程控制介绍 1.1 流程控制结构介绍 流程控制语句是用来控制程序中各语句执行顺序的语句,可以将语句组合成完成一定功能的逻辑模块。 一个程序会包含三种流程控制结构:顺序结构、分支结构、循环结构 顺序结构在没有使用程序流程控制语句(if-else语句、switch-case语…

解决vue3项目打包发布到服务器后访问页面显示空白问题

1.在 vite.config.ts 文件中 加入 base:./ 当你将 base 设置为 / 时,它表示你的应用程序将部署在服务器的根路径上,(将 base 设置为 / 表示你的应用程序部署在服务器的根路径上,并且 Vite 会相应地处理资源和路由的路径…

掌握大型语言模型(LLM)技术:推理优化

原文链接:Mastering LLM Techniques: Inference Optimization | NVIDIA Technical Blog 大模型相关技术文章已整理到Github仓库,欢迎start! 堆叠Transformer层以创建大型模型可以获得更好的准确性、few-shot学习能力,甚至在各种语言任务中具有…

springboot 2.4.4集成 hikari连接池多数据源实例

文章目录 前言一、配置步骤1.1 pom配置1.2 application.properties配置1.3 DataSourceContextHolder类1.4 DynamicDataSource1.5 DataSourceconfig类配置1.6 配置TargetDataSource注解1.7 切面方法1.8 dao的写法 二、测试验证2.1 启动springboot项目2.2 检查数据库连接2.3 debu…

SpringBoot项目打jar包

本文章使用idea进行打包 1.打开项目,右击项目选中Open Module Settings进入project Structure,如下图所示: 2.选中Artifacts,点击中间的加号(Project Settings->Artifacts->JAR->From modules with dependen…

JavaScript <有道翻译之数据解密‘23年12月06日版‘>--案例(三)

前言: 记得上半年还是去年,有道翻译还是直接返回明文数据;现在也跟着,用接口返回加密数据了; 娱乐一下,破他的密文数据... 成品效果图: js部分: 对于找他的密文数据有点费时,针对密文--->搜他地址和启动器不是特别容易,辗转多时(搜:descrypt/json.parse 结合使用更快),有图…

SpaceSight、Echo 联合升级,打造更懂场景的 AI 「超级门店」

当各领域都在谈论「增长」,门店业务的增长又该从哪里开始着手…… 在日常运营中,「高效」和「细致」是否无法同时实现?「任务下达」和「任务执行」之间有多大偏差? 在客户洞察上,如何用「过去」的数据预测「未来」&…

docker搭建logstash和使用方法

配置logstash 查询下载镜像【固定和elasticsearch一样的版本】 [roothao ~]# docker search logstash NAME DESCRIPTION STARS OFFICIAL AUTOMATED logstash …

CoreDNS实战(五)-接入prometheus监控

1 背景 Prometheus插件作为coredns的Plugins,默认情况下是内置在coredns中,如果是自己编译安装的版本,需要注意在编译安装的时候的plugin.cfg文件中添加了prometheus:metrics,这样才能确保编译成功。 # 首先我们检查一下运行的版…

万亿氢能产业链崛起,汉威科技助力安全发展

近年来化石能源的大量使用带来了碳排放急剧上升、环境污染、极端天气频发、全球变暖等一系列问题,加之化石能源储量日益减少,各国不得不考虑重构能源体系,寻找化石能源的替代方案,努力降低碳排放。 在此背景下,氢能成…

gmid方法设计五管OTA二级远放

首先给出第一级是OTA,第二级是CS的二级运放电路图: gmid的设计方法可以根据GBW、Av、CL来进行电路设计,因此在设计电路之前需要以上的参数要求。 1、为了满足电路的相位裕度至少60,需要对GBW、主极点、零点进行分析。 首先给出其…

Python Dask库:大数据处理的利器

更多资料获取 📚 个人网站:ipengtao.com Dask是一个灵活、开源的Python库,专为处理大规模数据集而设计。与传统的单机计算相比,Dask能够在分布式系统上运行,有效利用集群的计算资源。本文将深入介绍Dask的核心概念、功…

近期Google paly再次卡审?需要开发者提供更多关于应用的信息以通过谷歌审查?

谷歌政策更新得越来越频繁,也越来越严格,加大了对应用的审核力度。 最近,不少开发者表示,谷歌卡审又出新花样了。与之前收到暂停审核电话验证邮件(需要在48-72小时内,拨打你开发者账号的号码,应…