【剑指 Offer】52. 两个链表的第一个公共节点。 难度等级:简答 -- 中等。双指针法太秀了

news2025/1/6 20:45:25

文章目录

    • 1. 题目
    • 2. 我的解法:哈希表,空间复杂度 0(n),不符合要求
      • 2.1 算法思路
      • 2.2 code
    • 3. 双指针法:浪漫相遇太秀了
      • 3.1 算法思路
      • 3.2 code

1. 题目

题目链接:剑指 Offer 52. 两个链表的第一个公共节点

输入两个链表,找出它们的第一个公共节点。

在这里插入图片描述
在这里插入图片描述
注意:

如果两个链表没有交点,返回 null.
在返回结果后,两个链表仍须保持原有的结构。
可假定整个链表结构中没有循环。
程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。

这里要留意时间复杂度和空间复杂度的要求

2. 我的解法:哈希表,空间复杂度 0(n),不符合要求

2.1 算法思路

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

首先遍历链表 headA,并将链表 headA中的每个节点加入哈希集合中。然后遍历链表 headB,对于遍历到的每个节点,判断该节点是否在哈希集合中:

  • 如果当前节点不在哈希集合中,则继续遍历下一个节点;
  • 如果当前节点在哈希集合中,则后面的节点都在哈希集合中,即从当前节点开始的所有节点都是两个链表的公共节点,因此在链表 headB 中遍历到的第一个在哈希集合中的节点就是两个链表的第一个公共节点,返回该节点。

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

2.2 code

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
        hashmap={}
        while headA:
            hashmap[headA]=headA
            headA=headA.next
        while headB:
            if headB in hashmap:
                return headB
            headB=headB.next
        return None      

假设 链表 headA 和 headB 的长度分别为 m 和 n,则时间复杂度为 O(m+n),空间复杂度为 O(m),因为需要使用哈希集合存储链表 headA 中的全部节点。

但题目要求空间复杂度为 O(1),因此改方法不符合要求。

3. 双指针法:浪漫相遇太秀了

算法参考:图解 双指针法,浪漫相遇

3.1 算法思路

两个链表长度分别为 L1+C、L2+C, C为公共部分的长度。

第一个人走了L1+C步后,回到第二个人起点走L2步;第2个人走了L2+C步后,回到第一个人起点走L1步。 当两个人走的步数都为 L1+L2+C 时就两个家伙就相遇了

3.2 code

初级代码:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
        pt1=headA
        pt2=headB
        while pt1!=pt2:
            if pt1:
                pt1=pt1.next
            else:
                pt1=headB
            
            if pt2:
                pt2=pt2.next
            else:
                pt2=headA
        return pt1

进阶版代码:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
        pt1=headA
        pt2=headB
        while pt1!=pt2:
            pt1=pt1.next if pt1 else headB
            pt2=pt2.next if pt2 else headA
        return pt1

这个双指针法实在太秀了,但是这么秀的方法难度是简单 ???

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

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

相关文章

丢失msvcr120.dll的解决方法

1、什么是MSVCR120.dll? MSVCR120.dll是微软公司开发的Visual 2013程序的一部分。某些应用程序或游戏可能需要此文件才能正常工作。如果msvcr120.dll缺失,无论何时启动应用程序/游戏,都可能会遇到各种错误。 2、 msvcr120.dll软件特色 1、该…

九.图像处理与光学之图像几何变换算法(双线性插值)

九.图像处理与光学之图像几何变换算法(双线性插值) 9.0 前言 ​ 图像几何变换是图像处理中非常基础实用的技能,主要包括图片位移、缩放、镜像、剪切、放射变换等,在对图像进行空间变换的过程中,典型的情况是在对图像进行放大,旋转处理的时候,图像会出现失真的现象。这是…

【半监督医学图像分割 2023 MICCAI】SCP-Net

文章目录 【半监督医学图像分割 2023 MICCAI】SCP-Net摘要1. 简介2. 方法2.1 自交原型预测2.2 典型预测不确定性2.3 无监督原型一致性约束SPCCCPCC 3 实验与结果3.1 数据集和评价指标3.2 实施细节3.3 与其他方法的比较3.4 消融研究 4. 总结 【半监督医学图像分割 2023 MICCAI】…

Word表格设置边框不生效的解决方法

1、这是新建并随意设置的表格,可以看出来上边框、内边框和下边框都是不同的粗细,很不协调。 2、选中表格,然后右击——>表格属性——>边框和底纹。 3、三线表,一般上边框和下边框都是1磅,内边框是0.5磅&#xff…

别再瞎忙活,掌握营销策划的核心机密

很多时候看多了那些广告门上的案例,就感觉出一个策略就一定要引爆市场才行,如果不能引爆,那营销策划就没用,这个非黑即白的思维要改改。 事实上,我们大部分的营销人,做的营销策划方案都是处于灰色地带&…

QT获取电脑系统,主板型号,CPU型号,硬盘型号,内存大小等相关信息(一)通过CMD和WMIC命令行的方式

QT通过CMD和WMIC命令行的方式获取电脑系统,主板型号,CPU型号,硬盘型号等相关信息,包括使用diskpart,wmic,DIrectX等 目录导读 一、DIrectX诊断工具打开窗体查看命令行输出 二、 直接CMD输入SYSTEMiNFO三、WMIC命令查询1.获取系统盘…

PaddleClas:自定义backbone

PaddleClas提供的都是现成的网络结构和权重,不一定适用,所以有必要掌握魔改的技能。 PaddleClas版本:2.5 1:新建 mynet.py 在 ppcls/arch/backbone/model_zoo/ 文件夹下新建一个自己的模型结构文件 mynet.py,即你自己…

抖音seo矩阵系统源码开发部署-开源分享(二)

目录 市场背景分析 一、 抖音seo矩阵系统开发部署流程 二、 源码开发功能构思 三、 抖音seo源码开发部署注意事项 四、 部分开发代码展示 市场背景分析 账号矩阵是通过不同平台不同账号之间建立联系,通过将同一品牌下不同平台不同账号的粉丝流量进行账号互通&a…

【MySQL】不允许你不了解联结表

🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集! 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指…

测试人如何高效地设计自动化测试框架?

目录 前言: 什么是自动化测试框架? 好框架的定义 设计框架的思路 自动化测试实施思路: 自动化开展建议: 总结: 前言: 关于测试框架的好处,比如快速回归提高测试效率,提高测试…

IBM服务器RAID5磁盘阵列出现故障的数据恢复案例

服务器数据恢复环境: IBM某型号服务器,服务器中5块SAS磁盘组建了一组RAID5磁盘阵列。划分了一个LUN以及3个分区:第一个分区存放windows server系统,第二个分区存放SQL Server数据库,第三个分区存放备份文件。 服务器故…

第一章:L2JMobius学习 - 安装mariadb10数据库

L2JMobius是一套开源的 LineageII 的服务器端代码,使用Java语言编写。想要运行L2JMobius源程序的话,首先要搭建环境,需要安装mariadb数据库和jdk。本章节,我们介绍如何安装mariadb10 数据库。下载地址为(阿里云镜像&am…

分布式运用——监控平台 Zabbix

分布式运用——监控平台 Zabbix 一、监控平台种类二、我们今天介绍Linux操作系统的传统监控平台——zabbix 6.0版本1.zabbix 是什么?2.**zabbix 监控原理:**3.Zabbix 6.0 新特性:4. Zabbix 6.0 功能组件:5.数据库6.Web 界面7.Zabb…

Xcode通过Add package自动集成第三方SDK问题汇总

问题1: 解决方法:这个问题可能是因为 Adjust 或者 Facebook 的库当中依赖的某些类库的仓库地址是 git:// 协议,通过这种协议与 GitHub 通讯时会使用到你的 SSH 配置,你电脑上相关的 ssh key 使用了 GitHub 不再支持的格式&#xf…

Java集合框架进阶学习(ArrayList源码分析、HashMap实现原理)

文章目录 1、算法复杂度1.1、时间复杂度分析1.2、空间复杂度小总结 2、List2.1、数组小总结 2.2、ArrayList源码分析2.3、单向链表2.4、双向链表小总结 3、HashMap3.1、二叉树小总结 3.2、散列表小总结 3.3、HashMap的实现原理3.4、HashMap的put方法的具体流程3.5、HashMap的扩…

简历石沉大海!这份新鲜出炉的测试用人需求分析报告揭示了原因

最近有朋友吐槽简历投递后石沉大海,而主动打电话面试的除了外包还是外包。软件测试就业形势真的这么糟糕了? 小酋决定用数据揭开真相。因此小酋选取“软件测试”、“自动化测试”、“测试开发”作为搜索关键词,统计了 无忧网 近一个月用人市…

目标跟踪基础:两张图片相似度算法

本文来自公众号“AI大道理” —————— 目标跟踪就是在时序帧中搜索目标的过程,本质上就是检索。 不管是传统的目标跟踪中的生成模型和判别模型,还是用深度学习来做目标跟踪,本质上都是来求取目标区域与搜索区域的相似度,这就…

C# 依赖倒置原则(DIP)

目录 一,引子 1.1 传统的程序架构 1.2 依赖倒置 1.3 依赖倒置的作用 二,依赖注入 一,引子 1.1 传统的程序架构 在程序执行过程中,传统的程序架构如图: 可以看到,在传统的三层架构中,层与…

CSS的学习4(盒子模型及浮动)

CSS的学习3:http://t.csdn.cn/xDxIJ 盒子模型 网页布局过程 先准备好相关的网页元素,网页元素基本都是盒子Box利用CSS设置好盒子样式,然后摆放到相应位置往盒子里面装内容 封装周围的HTML元素: 边框(border&#…

[网鼎杯 2020 青龙组]AreUSerialz1

代码审计 得到一大串源码&#xff0c;但是不要慌&#xff0c;虽然源码很多&#xff0c;其实题目并不难 这段代码是一个简单的文件读写类 FileHandler&#xff0c;以及一个反序列化函数 unserialize() 的使用。 <?phpinclude("flag.php");highlight_file(__FILE__…