26、【链表】相交链表(C++版本)

2023-11-10

题目描述

在这里插入图片描述在这里插入图片描述

题目分析

目标是找到两个链表若相交时的公共结点,那么便需要分析公共结点所具有的特性。

假设链表A和链表B具有公共结点,那么在公共结点处之后,两个链表具有相同长度和数值的结点。而在公共结点之前,两个链表的所具有的结点个数并不一定相等。

因此,若分别从链表A和B的公共结点开始遍历直到遍历到NULL结束,则链表A和链表B的遍历次数一定相等。问题的关键便是如何找到这一部分相等的长度,影响我们无法找到长度的因素是链表A和B公共节点之前的链表,因为公共结点之前的链表长度不一定相等。

因此,我们从链表的长度进行研究。
设链表A的长度为:
a + x = la
其中a为公共结点之前的链表长度,x为从公共结点到最后一个结点的长度,la为链表A的总长度。

设链表B的长度为:
b + x = lb
其中b为公共结点之前的链表长度,x为从公共结点到最后一个结点的长度,lb为链表B的总长度。

而我们可发现a + b + x = la + b = lb + a,根据这一条件,便可以找到等价关系,便找到了边界条件。

所以,la + b = lb + a,即走完A后再走B的前一段距离等于走完B后再走A的前一段距离。
在这里插入图片描述

参考文章:
图解相交链表

Intersection of Two Linked Lists (双指针,链表拼接)

代码实现

分别定义一个指针cur_a指向headA和指针cur_b指向headB,当cur_a遍历完headA时,让它指向headB的开头,同理,让cur_b遍历完时,让它指向headA的开头。目的是让两个指针分别走过上述a + b + x长度的路程,从而消除两个链表之间的长度差。当消除完后,两个链表的下一个结点,便是公共结点。

当走完后,如果为NULL,则说明无公共结点,否则返回的便是公共结点。

class Solution {
public:
	ListNode *getIntersectionNode(ListNode *headA, ListNode *headB){
	if(headA == nullptr && headB == nullptr)
		return nullptr;
	ListNode* cur_a = headA;
	ListNode* cur_b = headB;

	while(cur_a != cur_b)	{
		cur_a = (cur_a ? cur_a->next : headB);
		cur_b = (cur_b ? cur_b->next : headA);
	}
	return cur_a;
}
};
# 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:
        p1, p2 = headA, headB

        while p1 != p2 :
            p1 = p1.next if p1 else headB
            p2 = p2.next if p2 else headA
        
        return p1

时间复杂度为O(n),空间复杂度为O(n)

链表相交

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

26、【链表】相交链表(C++版本) 的相关文章

随机推荐

  • Redis常见数据结构的常用命令及引用

    String 1 常用命令 字符串常用操作 SET key value 存入字符串键值对 MSET key value key value 批量存储字符串键值对 SETNX key value 存入一个不存在的字符串键值对 GET key
  • AVLTree-平衡二叉树-coming soon

  • php验证用户账号密码正确,php-检查用户名和密码是否正确

    因为我的代码是正确的 所以我总是得到回显 Username Passwordcorrect 用户名 密码是否匹配 我的问题是 我在下面的代码中为PHP总是回显 用户名 密码错误 而做错了什么 require privstuff dbinfo
  • jupyter notebook使用基础及其快捷键,包括对文档操作、cell操作、快捷键、markdown

    目录 Jupyter Notebook介绍 使用原因 基本操作 新建notebook文档 对文档的操作 cell操作 什么是cell Jupyter支持两种模式 鼠标操作 Jupyter快捷键操作 markdown演示 手动建导航 Jupy
  • 网络编程 - Java SSLSocketFactory 创建方式

    SSL TLS 认证需要服务端提供 KeyStore jks TrustStore jks 实现方式 优缺点 服务端提供 CA Client CRT Client Key 文件 缺点 服务端提供原始签名 不安全不建议采用 服务端提供 Key
  • linux $0命令,Linux:awk命令详解

    简单使用 awk 对于文件中一行行的独处来执行操作 awk F print 1 4 使用 来分割这一行 把这一行的第一第四个域打印出来 AWK命令介绍 awk语言的最基本功能是在文件或字符串中基于指定规则浏览和抽取信息 awk抽取信息后 才
  • 2023最新pycharm详细安装教程,小白必看

    一 python官网 Python官网主要有python的About 简介 Downloads 下载 Documentation 文档 Community 团体 Success Stories 成功案例 News 新闻 Events 事件动
  • 贪吃蛇智能版(专家)

    在高级版本的基础之上 主要针对以下问题进行了处理 当长度逐渐变成 超过100之后 随机wander 追尾有比较大的随机性 弄不好就把自己围死了 这个时候已经不能再看到实物马上就去吃了 在吃之前必须先调整好自身的状态 等到认为调整的差不多的时
  • 如何在sqlserver建立新用户并关联相应的数据库

    我们经常需要在数据库上建立有权限的用户 该用户只能去操作某个特定的数据库 比如该用户只能去读 去写等等 那么我们应该怎么在sqlserver上设置呢 下面的步骤有点长 只要一步一步跟着设置就行 方法 步骤 如果你没有开通sqlserver身
  • GoWeb开发-3.JWT

    1 导入依赖库 go get u github com dgrijalva jwt go 2 生成token import fmt github com gin gonic gin jwt github com dgrijalva jwt
  • 将树莓派上的文件发送到服务器,怎样将树莓派变成网络文件系统版本4服务器...

    简介 网络文件系统 NFS 可以同时在版本2 3 4中运行 NFS版本4 NFSv4 在NFSv2和NFSv3 我最喜欢的改进是 NFSv4使配置防火墙变得简单 因为NFSv4仅使用一个端口 默认为2049 而NFSv2和NFSv3使用4个
  • 搭建 llvm 学习环境

    1 下载llvm git clone https github com llvm llvm project git 因为国内网络的原因 clone的时候没有反应 可以多此 Ctrl C 重新 clone 2 下载安装cmake 注意 下载的
  • 毕业设计-基于学习元的双螺旋深度学习模型

    目录 前言 课题背景和意义 实现技术思路 一 基于学习元的深度学习支撑系统 二 双螺旋深度学习模型 三 深度学习的开放课程设计实践 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备
  • 网页打开摄像头_听说,考试的时候你打不开摄像头?

    近期真没什么可写的 赶在考试之前就来说一说雨课堂打不开摄像头如何解决吧 先推荐一个检测浏览器摄像头权限的网址 https assistant ceping com qrcode type 1 lng zh 如果在这个网址下摄像头一切正常 雨
  • uplift model增益模型相关术语概念名词汇总

    因果推断 增益模型综述 http proceedings mlr press v67 gutierrez17a gutierrez17a pdf 名词 缩写 英文全称 名词解释 备注 treatment 干预 实验组 control 不干预
  • vscode代码发送至微信开发者工具无法识别mqtt服务器地址(无论正确服务器地址还是错误地址,均不报错也不连接)

    调试器可以正常显示报错 并且小程序界面一也可以更新UI 但是唯独不更新服务器部分的错误 未搜索到相似问题 个人尝试出了一个解决办法 解决了我个人的这个问题 不一定普适 供参考 卸载mqtt npm uninstall mqtt 安装2 18
  • gradle:Connection timed out 问题解决

    gradle Connection timed out 问题解决 gradle Connection timed out 问题解决 先来重现一下问题 公司技术选型使用了gradle作为构建工具 问题重现 使用的系统是windows10 准备
  • fgets函数使用

    一 作用 fgets函数用于从指定的文件流中读取一行字符串 并将其存储到指定的字符数组中 它可以读取包括空格在内的所有字符 直到遇到换行符或文件结束符为止 fgets函数还可以指定最大读取的字符数 以防止缓冲区溢出 二 使用方法 fgets
  • HJ17 坐标移动

    Powered by NEFU AB IN Link 文章目录 HJ17 坐标移动 题意 思路 代码 HJ17 坐标移动 题意 开发一个坐标计算工具 A表示向左移动 D表示向右移动 W表示向上移动 S表示向下移动 从 0 0 点开始移动 从
  • 26、【链表】相交链表(C++版本)

    题目描述 题目分析 目标是找到两个链表若相交时的公共结点 那么便需要分析公共结点所具有的特性 假设链表A和链表B具有公共结点 那么在公共结点处之后 两个链表具有相同长度和数值的结点 而在公共结点之前 两个链表的所具有的结点个数并不一定相等