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

 系列专栏

《分治》

《模拟》

《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;
    }
};


💗感谢阅读!💗

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

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

相关文章

Pikachu-xss防范措施 - href输出 js输出

总体原则: 输入做过滤,输出做转义 过滤:根据业务需要进行过滤,如:输入点要求输入手机号,则只允许输入手机号格式的数字; 转义:所有输出到前端的数据,都根据输出点进行转…

OpenCV计算机视觉库

计算机视觉和图像处理 Tensorflow入门深度神经网络图像分类目标检测图像分割OpenCVPytorchNLP自然语言处理 OpenCV 一、OpenCV简介1.1 简介1.2 OpenCV部署1.3 OpenCV模块 二、OpenCV基本操作2.1 图像的基本操作2.1.1 图像的IO操作2.1.2 绘制几何图像2.1.3 获取并修改图像的像素…

【算法篇】回溯算法类(2)(笔记)

目录 一、LeetCode 题目 1. 子集II 2. 递增子序列 3. 全排列 4. 全排列 II 5. 重新安排行程 6. N皇后 7. 解数独 二、题目思路整理 一、LeetCode 题目 1. 子集II https://leetcode.cn/problems/subsets-ii/description/https://leetcode.cn/problems/subsets-ii/des…

【C++】类与对象基础概念解析

恭喜你学习完C语言与数据结构的有关内容,现在让我们开始进行对C的学习吧~ 💝💝💝如果你对C语言或数据结构还存在疑惑,欢迎观看我之前的作品 👉【数据结构】 👉【C语言】 目录 一、引言 二、类…

MapBox Android版开发 6 关于Logo

MapBox Android版开发 6 关于Logo Logo的显示查看源码及思路(Logo)第一步第二步 隐藏Logo示例查看源码及思路(Info)第一步第二步 隐藏Logo和Info示例 看到有网友留言问如何移除Logo,今天看了下V9源码,发现M…

CORE MVC 过滤器 (筛选器)《2》 TypeFilter、ServiceFilter

TypeFilter、ServiceFilter ServiceFilter vs TypeFilter ServiceFilter和TypeFilter都实现了IFilterFactory ServiceFilter需要对自定义的Filter进行注册,TypeFilter不需要 ServiceFilter的Filter生命周期源自于您如何注册(全局、区域)&…

Ps:打开与置入

在 Adobe Photoshop 中,理解不同的“打开”和“置入”命令及其用途,可以根据不同的需求选择最佳方式来管理和编辑图像文件。 ◆ ◆ ◆ 打开 1、Ps菜单:文件/打开 File/Open 快捷键:Ctrl O 用于直接打开现有的图像文件。 打开的…

【HDP】zookeeper未授权漏洞修复

目录 一、禁用四字命令 二、ZK-Client增加kerberos 一、禁用四字命令 Zookeeper四字命令的使用方式非常简单,通常有两种方式。第一种是通过Telnet方式,使用Telnet客户端登录ZooKeeper的对外服务端口,然后直接使用四字命令即可;第…

计算机网络-系分(5)

目录 计算机网络 DNS解析 DHCP动态主机配置协议 网络规划与设计 层次化网络设计 网络冗余设计 综合布线系统 1. 双栈技术 2. 隧道技术 3. 协议转换技术 其他网络技术 DAS(Direct Attached Storage,直连存储) NAS(Net…

centos环境安装JDK详细教程

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

【Android 14源码分析】Activity启动流程-3

忽然有一天,我想要做一件事:去代码中去验证那些曾经被“灌输”的理论。                                                                                  – 服装…

鸿蒙harmonyos next纯flutter开发环境搭建

公司app是用纯flutter开发的,目前支持android和iOS,后续估计也会支持鸿蒙harmonyos。目前谷歌flutter并没有支持咱们国产手机操作系统鸿蒙harmonyos,于是乎国内有个叫OpenHarmony-SIG的组织,去做了鸿蒙harmonyos适配flutter开发的…

安卓主板_MTK4G/5G音视频记录仪整机及方案定制

音视频记录仪方案,采用联发科MT6877平台八核2* A78 6* A55主频高达2.4GHz, 具有高能低耗特性,搭载Android 12.0智能操作系统,可选4GB32GB/6GB128GB内存,运行流畅。主板集成NFC、双摄像头、防抖以及多种无线数据连接,支…

【web安全】——sql注入

1.MySQL基础 1.1information_schema数据库详解 简介: 在mysql5版本以后,为了方便管理,默认定义了information_schema数据库,用来存储数据库元数据信息。schemata(数据库名)、tables(表名tableschema)、columns(列名或字段名)。…

java设计模式介绍

常见的设计模式有哪些呢? 单例模式(Singleton Pattern): 就像是武林中的“独孤求败”,一个类只有一个实例,并提供一个全局访问点。 常用于需要控制资源访问的场景,比如数据库连接池。 工厂模式…

828华为云征文|部署音乐流媒体服务器 mStream

828华为云征文|部署音乐流媒体服务器 mStream 一、Flexus云服务器X实例介绍二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置2.4 Docker 环境搭建 三、Flexus云服务器X实例部署 mStream3.1 mStream 介绍3.2 mStream 部署3.3 mStream 使用 四、…

51c自动驾驶~合集1

我自己的原文哦~ https://blog.51cto.com/whaosoft/11466109 #HTCL 超过所有视觉方案!HTCL:分层时间上下文问鼎OCC 本文是对ECCV2024接受的文章 HTCL: 的介绍,HTCL在SemanticKITTI基准测试中超过了所有基于相机的方法,甚至在和…

java中创建不可变集合

一.应用场景 二.创建不可变集合的书写格式(List,Set,Map) List集合 package com.njau.d9_immutable;import java.util.Iterator; import java.util.List;/*** 创建不可变集合:List.of()方法* "张三","李四","王五…

每日OJ题_牛客_游游的水果大礼包_枚举_C++_Java

目录 牛客_游游的水果大礼包 题目解析 C代码 Java代码 牛客_游游的水果大礼包 游游的水果大礼包 (nowcoder.com) 描述: 游游有n个苹果,m个桃子。她可以把2个苹果和1个桃子组成价值a元的一号水果大礼包,也可以把1个苹果和2个桃子…

拆解维修飞科剃须刀

原因 用了好几年的剃须刀,经过一次更换电池。后来上面的盖帽松动,无法合盖,经过把弹片矫正后修复。最近一次”大力出奇迹“的操作直接断送了这个老伤员最后的可能性。最终只能花了将近十块大洋买了一套盖着和中间座。简单更换了一下。 记录…