【算法】链表:160.相交链表(easy)+双指针

news2024/10/3 20:50:50

 系列专栏

《分治》

《模拟》

《Linux》


目录

1、题目链接

2、题目介绍

3、解法(双指针) 

 返回结果

算法正确性

时间复杂度

4、代码


1、题目链接

160. 相交链表 - 力扣(LeetCode)

2、题目介绍

3、解法(双指针) 

推荐题解:题解 - 力扣(LeetCode)

该题解中的图示过程非常清晰!

这道题目,类似于检测两个链表中是否存在环。--->针对有环问题 ---> 我们通常使用快慢指针解决。

那么本题,使用的就是快慢指针的一个变形,找到两个链表的相交点。

设「第一个公共节点」为 node ,「链表 headA」的节点数量为 a ,「链表 headB」的节点数量为 b ,「两链表的公共尾部」的节点数量为 c ,则有:
 

头节点 headA 到 node 前,共有 a−c 个节点;
头节点 headB 到 node 前,共有 b−c 个节点;


考虑构建两个节点指针 A​ , B 分别指向两链表头节点 headA , headB ,做如下操作:

  • 指针 A 先遍历完链表 headA ,再开始遍历链表 headB ,当走到 node 时,共走步数为:a+(b−c)
  • 指针 B 先遍历完链表 headB ,再开始遍历链表 headA ,当走到 node 时,共走步数为:b+(a−c)

如下式所示,此时指针 A , B 重合,这是因为两个指针都遍历了相同的节点数(包括重复遍历的部分),并有两种情况:

a+(b−c)=b+(a−c)

  • 若两链表 有 公共尾部 (即 c>0 ) :指针 A , B 同时指向「第一个公共节点」node 。
  • 若两链表 无 公共尾部 (即 c=0 ) :指针 A , B 同时指向 null 。

 返回结果

返回 A(或 B,因为它们此时是相同的)作为相交节点的指针。

如果 A 和 B 没有相遇(都为 null 或指向不同的节点),则返回 null。但在这个算法中,由于我们是在两个链表之间循环遍历,所以它们要么相遇,要么在原始链表上同时到达末尾(然后重新遍历另一个链表),这种情况在逻辑上被视为不相交,因此实际上我们不需要显式地检查 null。

        

算法正确性

该算法的正确性基于这样一个事实:

如果两个链表相交,那么从两个链表的头节点出发,分别遍历到相交节点的路径长度之差一定等于两个链表长度之差。

当我们让一个指针到达链表末尾后重新指向另一个链表的头节点时,我们实际上是在“补齐这个长度差。

因此,两个指针最终会在相交节点上相遇。

时间复杂度

由于每个节点最多被访问两次(一次在其原始链表中,一次在另一个链表中),所以时间复杂度为 O(m + n),其中 m 和 n 分别是两个链表的长度。

空间复杂度

我们只使用了两个指针,所以空间复杂度为 O(1)。 

4、代码

/**
 * 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) {
        //a+b-c
        //a-c+b
        //有公共的结点,c>0,
        ListNode* pa = headA;
        ListNode* pb = headB;
        while (pa != pb)
        {
            if (pa == NULL)
                pa = headB;
            else
                pa = pa->next;

            if (pb == NULL)
                pb = headA;
            else
                pb = pb->next;
        }
        return pa;
    }
};


💗感谢阅读!💗

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

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

相关文章

MISC -第十天(音符加解密、敲击码、NtfsStreamsEditor工具)

前言 各位师傅大家好,我是qmx_07,今天继续讲解MISC的相关知识 [MRCTF2020]你能看懂音符吗 附件信息: rar文件无法打开,显示损坏,先放到hxd查看 头标识错误,尝试修复 rar标识头(52 61 72 21) 压缩包里有一个d…

4个顶级的大模型推理引擎

LLM 在文本生成应用中表现出色,例如具有高理解度和流畅度的聊天和代码完成模型。然而,它们的庞大规模也给推理带来了挑战。基本推理速度很慢,因为 LLM 会逐个生成文本标记,需要对每个下一个标记进行重复调用。随着输入序列的增长&…

【游戏模组】星际争霸1代模组燃烧之地,泰伦帝国对决UED。特效华丽兵种巨多特别好玩

各位星际争霸1代的粉丝大家好,今天小编给大家带来一个星际争霸1代的模组,这个模组的名字叫燃烧之地,主要是2个阵营。玩家可以扮演UED或者泰伦帝国中的一个来进行比赛。 这个模组设定的世界线背景是在异虫入侵并随后被星灵消灭后,…

昇思MindSpore进阶教程--梯度累加

大家好,我是刘明,明志科技创始人,华为昇思MindSpore布道师。 技术上主攻前端开发、鸿蒙开发和AI算法研究。 努力为大家带来持续的技术分享,如果你也喜欢我的文章,就点个关注吧 正文开始 本教程介绍梯度累加的训练算法…

C(十一)scanf、getchar(第三弹)

问题引入:如何实现输入一串密码,如:“123 xxxx” ,然后读取并确认,是 -- Y;否 -- N。 自然的,我们想到用scanf,但是在使用过程中你是否遇到跟我一样的困惑呢?如下&…

【Linux】进程管理:状态与优先级调度的深度分析

✨ 山海自有归期,风雨自有相逢 🌏 📃个人主页:island1314 🔥个人专栏:Linux—登神长阶 ⛺️ 欢迎关注:👍点赞 &#x1…

华为技术经理总结Java技术栈思维导图

最近帮在读大四的学生做了一个java项目,使用Spring bootVue3做了一个机器学习在线训练和服务的平台,发现他的Java技术栈并不全面,希望在下面分享一下Java技术栈,能够帮助到正在参加秋招或者是准备找工作的朋友们: 完整…

Vue.js 组件开发知识详解

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

为什么我可以做系统架构师?

人人都可以做产品经理,但是却没有人随随便便成为系统架构师,系统架构师为什么这么稀缺,因为系统架构师要求的能力是十分全面的,首先技术基本功要非常扎实,其次是你的统筹能力,一个项目交到你手上&#xff0…

软件管理【1.10】

软件管理【1.10】 13、软件管理13.1.包管理工具rpm13.2.yum和dnf13.2.1.配置yum源13.2.2.只下载安装包,不安装13.2.3.配置本地光盘ISO文件安装13.2.4.配置阿里云epel源13.2.5.base-for-centos7.repo13.2.6.base-for-rocky8.repo13.3.搭建私有yum仓库13.3.1.Apache实现网战功能…

力扣题解 1928

题目描述(困难) 规定时间内到达终点的最小费用 一个国家有 n 个城市,城市编号为 0 到 n - 1 ,题目保证 所有城市 都由双向道路 连接在一起 。道路由二维整数数组 edges 表示,其中 edges[i] [xi, yi, timei] 表示城市…

提示词工程实践

本讲义主要以text2SQL为场景进行讲解,包括提示词的编写和闭源模型调用、本地开源模型部署调用以及基于开源模型的微调。 回顾下大模型学习思路: 1. 开发环境准备 1.1 代码 代码位于【算法管理】->【公共算法】->【prompts_engineering_04】&…

leetcode每日一题day17(24.9.27)——每种字符最少取k个

思路:看到题目就想到了搜索, 广搜:满足要求就往后搜,最后返回搜索队列达到过的最大深度, 深搜:一直往一边取,搜索完所有可能,并在此基础上进行剪枝,剪枝方案有如果某一分…

大师级GC调优:剖析高并发系统的垃圾回收优化实战

前期准备 大家开始前一定要对VisualVM、Jmeter这两款工具有所了解! 1. 下载安装VisualVM,以便后续调优分析。JDK1.8及之前所在目录的bin目录下有自带的VisualVM,JDK1.8以后需要自行手动安装下载。 下载地址:https://visualvm.git…

模型的深度优化

文章目录 一、测试模型是否正确二、图形打印直观观察三、保存训练模型四、正确率(仅使用于分类问题) 一、测试模型是否正确 本文承接我的上一篇文章完整网络模型训练(一) 运用测试数据集(test_dataloader)…

第二十一章 (动态内存管理)

1. 为什么要有动态内存分配 2. malloc和free 3. calloc和realloc 4. 常⻅的动态内存的错误 5. 动态内存经典笔试题分析 6. 总结C/C中程序内存区域划分 1.为什么要有动态内存管理 我们目前已经掌握的内存开辟方式有 int main() {int num 0; //开辟4个字节int arr[10] …

全局安装cnpm并设置其使用淘宝镜像的仓库地址(地址最新版)

npm、cnpm和pnpm基本概念 首先介绍一下npm和cnpm是什么,顺便说一下pnpm。 npm npm(Node Package Manager)是Node.js的默认包管理器,用于安装、管理和分享JavaScript代码包。它是全球最大的开源库生态系统之一,提供了数…

centos环境安装JDK详细教程

centos环境安装JDK详细教程 一、前期准备二、JDK安装2.1 rpm方式安装JDK2.2 zip方式安装JDK2.3 yum方式安装JDK 本文主要说明CentOS下JDK的安装过程。JDK的安装有三种方式,用户可根据实际情况选择: 一、前期准备 查看服务器操作系统型号,执…

YOLOv7改进之主干DAMOYOLO结构,结合 CReToNeXt 结构,打造高性能检测器

一、DAMOYOLO理论部分 论文地址:2211.15444 (arxiv.org) 在本报告中,我们提出了一种快速准确的对象检测方法,称为 DAMO-YOLO,它实现了比最先进的 YOLO 系列更高的性能。DAMO-YOLO 是从 YOLO 扩展而来的,具有一些新技术,包括神经架构搜索 (NAS)、高效的重新参数化广义 …

【Linux】用虚拟机配置Ubuntu 24.04.1 LTS环境

目录 1.虚拟机安装Ubuntu系统 2.Ubuntu系统的网络配置 3.特别声明 首先我们先要下载VMware软件,大家自己去下啊! 1.虚拟机安装Ubuntu系统 我们进去之后点击创建新的虚拟机,然后选择自定义 接着点下一步 再点下一步 进入这个界面之后&…