LeetCode 160. 相交链表

news2024/9/23 5:29:58

原题链接

难度: e a s y \color{Green}{easy} easy

题目描述

给你两个单链表的头节点 h e a d A headA headA h e a d B headB headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 n u l l null null

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

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

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

自定义评测:

评测系统 的输入如下(你设计的程序 不适用 此输入):

  • i n t e r s e c t V a l intersectVal intersectVal - 相交的起始节点的值。如果不存在相交节点,这一值为 0 0 0
  • l i s t A listA listA - 第一个链表
  • l i s t B listB listB - 第二个链表
  • s k i p A skipA skipA - 在 l i s t A listA listA 中(从头节点开始)跳到交叉节点的节点数
  • s k i p B skipB skipB - 在 l i s t B listB listB 中(从头节点开始)跳到交叉节点的节点数

评测系统将根据这些输入创建链式数据结构,并将两个头节点 h e a d A headA headA h e a d B headB headB 传递给你的程序。如果程序能够正确返回相交节点,那么你的解决方案将被 视作正确答案

示例 1:

输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,6,1,8,4,5], skipA = 2, skipB = 3
输出:Intersected at '8'
解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,6,1,8,4,5]。
在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。
— 请注意相交节点的值不为 1,因为在链表 A 和链表 B 之中值为 1 的节点 (A 中第二个节点和 B 中第三个节点) 是不同的节点。换句话说,它们在内存中指向两个不同的位置,而链表 A 和链表 B 中值为 8 的节点 (A 中第三个节点,B 中第四个节点) 在内存中指向相同的位置。

示例 2:

输入:intersectVal = 2, listA = [1,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1
输出:Intersected at '2'
解释:相交节点的值为 2 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [1,9,1,2,4],链表 B 为 [3,2,4]。
在 A 中,相交节点前有 3 个节点;在 B 中,相交节点前有 1 个节点。

示例 3:

输入:intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2
输出:null
解释:从各自的表头开始算起,链表 A 为 [2,6,4],链表 B 为 [1,5]。
由于这两个链表不相交,所以 intersectVal 必须为 0,而 skipA 和 skipB 可以是任意值。
这两个链表不相交,因此返回 null 。

提示:

  • l i s t A listA listA 中节点数目为 m m m
  • l i s t B listB listB 中节点数目为 n n n
  • 1 < = m , n < = 3 ∗ 1 0 4 1 <= m, n <= 3 * 10^{4} 1<=m,n<=3104
  • 1 < = N o d e . v a l < = 1 0 5 1 <= Node.val <= 10^{5} 1<=Node.val<=105
  • 0 < = s k i p A < = m 0 <= skipA <= m 0<=skipA<=m
  • 0 < = s k i p B < = n 0 <= skipB <= n 0<=skipB<=n
  • 如果 l i s t A listA listA l i s t B listB listB 没有交点, i n t e r s e c t V a l intersectVal intersectVal 0 0 0
  • 如果 l i s t A listA listA l i s t B listB listB 有交点, i n t e r s e c t V a l = = l i s t A [ s k i p A ] = = l i s t B [ s k i p B ] intersectVal == listA[skipA] == listB[skipB] intersectVal==listA[skipA]==listB[skipB]

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


算法

(链表、指针扫描) O ( n ) O(n) O(n)

算法步骤:

  • 用两个指针分别从两个链表头部开始扫描,每次分别走一步;
  • 如果指针走到null,则从另一个链表头部开始走;
  • 当两个指针相同时,
    • 如果指针不是null,则指针位置就是相遇点;

    • 如果指针是 null,则两个链表不相交;

证明:

两个链表不相交的情况:
在这里插入图片描述
a,b 分别代表两个链表的长度,则两个指针分别走 a+b 步后都变成 null。

两个链表相交的情况:
在这里插入图片描述
则两个指针分别走 a+b+c 步后在两链表交汇处相遇。

验证如下:
在这里插入图片描述

C++ 代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        auto p = headA, q = headB;

        while (p != q) {
            if (p) p = p->next;
            else p = headB;
            if (q) q = q->next;
            else q = headA;
        }

        return p;
    }
};

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

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

相关文章

分享12款我常用的开源免费软件

嗨,大家好, 我是徐小夕, 在一个劳动力追求高性价的时代, 我们无时无刻不在追寻更高的工作学习效率, 提高工作舒适度,接下来我就和大家分享一下我之前用过的, 能提高工作效率的开源免费工具.1. 修图&#xff1a;Krita 【开源】image.png地址: https://krita.org/zh/Krita 是一款…

CK-GW06-E03与欧姆龙PLC配置指南

CK-GW06-E03与欧姆龙PLC配置指南CK-GW06-E03是一款支持标准工业EtherCAT协议的网关控制器,方便用户集成到PLC等控制系统中。本控制器提供了网络 POE 供电和直流电源供电两种方式&#xff0c;确保用户在使用无POE供电功能的交换机时可采用外接电源供电&#xff1b;系统还集成了六…

Mac环境下安装MongoDB数据库

一、下载安装 1.1 下载MongoDB 首先&#xff0c;从MongoDB官网下载自己想要使用的版本。 解压缩下载的压缩包重命名为mongodb&#xff0c;将mongodb文件夹复制到/usr/local目录下。 brew tap mongodb/brew brew install mongodb-community4.41.2 配置环境变量 打开.zshrc…

python 获取chrome浏览器的安装目录,即chrome的绝对路径

实现目标需要使用到&#xff08;引包|倒包&#xff09; 2 个 python 模块&#xff0c; import win32api import win32con 引言&#xff08;扉页&#xff09;&#xff1a; 也适用于查找安装在Windows中的应用程序的绝对路径&#xff0c; 譬如&#xff1a;微信&#xff08;WeChat…

APP自动化(1)-Appium中adb常用命令

1.建立Appium与手机模拟器的连接环境 首先确定的是Appium已经打开和手机模拟器已经打开并且appium点击了开始的按钮&#xff0c;然后用cmd进去win的dos系统&#xff0c; 输入tasklist找到这个进程号&#xff0c;每台电脑都是不一样的进程号要按照你自己的来 查询pid地址netst…

Git 构建分布式版本控制系统

版本控制概念Gitlab部署1.版本控制概念 1.1分类 &#xff08;一&#xff09;1 本地版本控制系统&#xff08;传统模式&#xff09; &#xff08;二&#xff09;2 集中化的版本控制系统 CVS、Subversion&#xff08;SVN&#xff09; &#xff08;三&#xff09;3 分布式…

linux程序分析工具

嵌入式调试工具1. nm2. addr2line3. readelf3.1 ELF 文件分类3.2 ELF文件组成3.3使用1. nm nm源于name&#xff0c;是linux下一个文本分析工具&#xff0c;可以罗列指定文件中的符号(函数名、变量&#xff0c;以及符号类型)。 nm命令参数如下&#xff1a; 用法&#xff1a;nm …

深入理解MySQLⅢ -- 锁与InnoDB引擎

文章目录锁概述全局锁表级锁表锁元数据锁意向锁行级锁行锁间隙锁&临键锁InnoDB引擎逻辑存储结构架构内存结构磁盘结构后台线程事务原理redo logundo logMVCC锁 概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#x…

Fiddler安装教程、工具图解

目录 一、Fiddler是什么&#xff1f; 二、Fiddler原理 三、Fiddler安装 Fiddler界面介绍 四、常用的工具图解 4.1会话列表 4.2状态栏 4.3内容显示区 一、Fiddler是什么&#xff1f; Fiddler是客户端与服务器之间的HTTP代理&#xff0c;是当前最常用的HTTP协议抓包工具。 …

谈谈 《 JavaScript - DOM编程艺术 》这本书

前言 好吧&#xff0c;现在已经2023年了&#xff0c;对于这本书&#xff08;第二版&#xff09;来说可能有点老了&#xff0c;这本书不是很难理解&#xff0c;但也不是很适合新手读&#xff0c;当然&#xff0c;这本书并不是百宝书 &#x1f4d5; &#xff0c;它更注重于编程的…

格式化字符串你都懂了吗

文章目录前言一、什么是格式化字符串&#xff1f;二、使用 % 格式化字符串三、使用 format() 格式化字符串总结前言 今天跟大家聊聊字符串的格式化这部分内容。乍一听“格式化”这三个字&#xff0c;有的初学者可能会懵&#xff1a;难道这是要清空字符串的节奏&#xff1f; 其…

网络管理之设备上线技术的发展现状和趋势

网络和网络设备无处不在 随着社会的发展和技术的进步&#xff0c;人类文明开始向信息时代演进&#xff0c;网络逐渐变成现代社会不可或缺的一部分&#xff0c;极大程度影响了人类的认知形式、思维方式与生活模式。从家庭网&#xff0c;到企业网&#xff1b;从无线网&#xff0…

Mysql MHA搭建

. 目录 机器配置 安装Docker Docker安装和启动Mysql8.0.26 搭建Mysql一主二从 设置三台机器免密访问 安装MHA 搭建问题记录 问题1 MHA验证主从复制报错Access denied; you need (at least one of) the SUPER, REPLICATION CLIENT privilege(s) for this operation 问题2 MHA验证…

doris - 数仓 拉链表 按天全量打宽表性能优化

数仓 拉链表 按天全量打宽性能优化现状描述优化现状描述 1、业务历史数据可以变更 2、拉链表按天打宽 3、拉链表模型分区字段设计不合理&#xff0c;通用的过滤字段没有作为分区分桶字段 4、拉链表表数据量略大、模型数据分区不合理和服务器资源限制&#xff0c;计算任务执行超…

安装JupyterLab失败的解决方案

由于本人电脑安装的Python版本3.6比较低&#xff0c;所以可能存在下面两种方法都安装失败&#xff0c;最后给出一个简单省事的方法。Jupyter lab比Jupyter Notebook要好用&#xff0c;试了之后感觉跟VSCode一样的存在&#xff0c;所以还是值得安装来代替Jupyter Notebook使用。…

Ae:解释素材

所谓解释素材 Interpret Footage&#xff0c;就是通过修改素材的某些属性&#xff08;像素长宽比、帧速率、颜色配置文件及 Alpha 通道类型等&#xff09;&#xff0c;让它能更好地参与到合成中去。Ae菜单&#xff1a;文件/解释素材快捷键&#xff1a;Ctrl Alt G在项目面板里…

【C语言】编程初学者入门训练(13)

文章目录121. 小乐乐算最高分122. 小乐乐计算求和123. 小乐乐计算函数124. 小乐乐查找数字125. kiki学程序设计基础126. kiki算期末成绩127. kiki说祝福语128. kiki的最高分129. 求质数的个数130. kiki去重整数并排序121. 小乐乐算最高分 问题描述&#xff1a;小乐乐的老师BoB…

4.2 双点双向路由重发布

1. 实验目的 熟悉双点双向路由重发布的应用场景掌握双点双向路由重发布的配置方法2. 实验拓扑 双点双向路由重发布如图4-6所示: 图4-6:双点双向路由重发布 3. 实验步骤 IP地址的配置R1的配置 <Huawei>system-v…

关键路径、工期、总时差和自由时差精讲

关键路径法是在进度模型中&#xff0c;估算项目最短工期&#xff0c;确定逻辑网络路径进度灵活性大小的一种方法。①计算原理a.计算ES、EF&#xff1a;从网络计划起点节点开始&#xff0c;沿箭线方向依次向前推算&#xff0c;数值取大。b.计算LS、LF&#xff1a;从网络计划终点…

SVFormer:走进半监督动作识别的视觉 Transformer

出品人&#xff1a;Towhee 技术团队 顾梦佳 半监督学习&#xff08;SSL&#xff09;的动作识别是一个关键的视频理解任务&#xff0c;然而视频标注的高成本加大了该任务的难度。目前相关的方法主要研究了卷积神经网络&#xff0c;较少对于视觉 Transformers&#xff08;ViT&…