每日一题-两个链表的第一个公共结点

文章目录

    • 两个链表的第一个公共结点
      • 问题描述
      • 示例说明
        • 示例 1
        • 示例 2
      • 方法及实现
        • 方法描述
        • 代码实现
      • 复杂度分析
      • 示例运行过程
        • 示例 1
        • 示例 2
      • 总结
      • 备注

两个链表的第一个公共结点

问题描述

给定两个无环的单向链表,找到它们的第一个公共节点。如果没有公共节点,则返回空。

要求:

  • 空间复杂度: O ( 1 ) O(1) O(1)
  • 时间复杂度: O ( n ) O(n) O(n)
  • 数据范围: 链表长度 n ≤ 1000 n \leq 1000 n1000

输入数据分为三个部分:

  1. 第一个链表的非公共部分。
  2. 第二个链表的非公共部分。
  3. 两个链表的公共部分。

后台会根据输入组装成两个单链表,传入FindFirstCommonNode函数,返回第一个公共节点。


示例说明

在这里插入图片描述

示例 1

输入:
{1,2,3}, {4,5}, {6,7}

链表结构:
第一个链表:1 -> 2 -> 3 -> 6 -> 7
第二个链表:4 -> 5 -> 6 -> 7

输出:
{6,7}

说明:
两个链表从节点值为 6 的位置开始公共,返回节点值为 6 的节点。


示例 2

输入:
{1}, {2,3}, {}

链表结构:
第一个链表:1
第二个链表:2 -> 3

输出:
{}

说明:
两个链表没有公共节点,返回 null


方法及实现

方法描述

采用双指针法:

  1. 设置两个指针 firstsecond 分别指向两个链表的头节点。
  2. firstsecond 不相等时,指针逐步向后移动:
    • 如果某个指针到达链表尾部,则跳转到另一个链表的头部。
    • 如果两个指针在某节点相遇,则该节点为第一个公共节点。
    • 如果两指针遍历结束仍未相遇,则无公共节点,返回 NULL
代码实现
struct ListNode* FindFirstCommonNode(struct ListNode* pHead1, struct ListNode* pHead2) {
    if (pHead1 == NULL || pHead2 == NULL) {
        return NULL;  // 如果任何一个链表为空,直接返回 NULL
    }

    struct ListNode* first = pHead1;  // 指针 first 初始指向链表1头部
    struct ListNode* second = pHead2;  // 指针 second 初始指向链表2头部

    // 当两个指针不相等时,继续循环
    while (first != second) {
        first = (first != NULL) ? first->next : pHead2;  // 如果 first 到达末尾,跳转到链表2头部
        second = (second != NULL) ? second->next : pHead1;  // 如果 second 到达末尾,跳转到链表1头部
    }

    return first;  // 返回第一个公共节点或 NULL
}

复杂度分析

  1. 时间复杂度:

    • 每个指针最多遍历两个链表的长度,总时间复杂度为 O ( n + m ) O(n + m) O(n+m),其中 n n n m m m 分别是两个链表的长度。
  2. 空间复杂度:

    • 只使用了两个指针,空间复杂度为 O ( 1 ) O(1) O(1)

示例运行过程

示例 1

输入:{1,2,3}, {4,5}, {6,7}
链表1:1 -> 2 -> 3 -> 6 -> 7
链表2:4 -> 5 -> 6 -> 7

  • 初始:first 指向 1second 指向 4
  • 第一次遍历:firstsecond 分别遍历各自链表,到达尾部后跳转到另一链表头部。
  • 第二次遍历:firstsecond 在节点 6 相遇。
  • 输出:{6,7}

示例 2

输入:{1}, {2,3}, {}
链表1:1
链表2:2 -> 3

  • 初始:first 指向 1second 指向 2
  • 第一次遍历:first 遍历到尾部后跳转到链表2头部,second 遍历到尾部后跳转到链表1头部。
  • 第二次遍历:firstsecond 均到达尾部(NULL)。
  • 输出:{}

总结

  • 双指针法通过交替遍历链表,保证了时间复杂度 O ( n + m ) O(n + m) O(n+m),且额外空间复杂度为 O ( 1 ) O(1) O(1)
  • 代码简单高效,能够准确找到第一个公共节点或判定无公共节点。

备注

最开始我写的代码是这样的

while (first!=second) {
     if(first->nex!=NULL)
    first= first->next;
    else first= pHead2;

     if(second->next!=NULL)
    second= second->next;
    else second= pHead1;
 }

结果发现有问题,如果两个不相交的链表,改成下面的才正确

while (first!=second) {
        if(first->next!=NULL)
       first= first->next;
       else first= pHead2;
 
        if(second->next!=NULL)
       second= second->next;
       else second= pHead1;
    }

思考了下原因,原来是如果按照旧的代码, if(first->next!=NULL),那么说明当前是队尾,使用 first= first->next;相当于第一个把第二个连起来了,两个队列相互首位相连,原本不
else first= pHead2;

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

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

相关文章

Elasticsearch:在 HNSW 中提前终止以实现更快的近似 KNN 搜索

作者:来自 Elastic Tommaso Teofili 了解如何使用智能提前终止策略让 HNSW 加快 KNN 搜索速度。 在高维空间中高效地找到最近邻的挑战是向量搜索中最重要的挑战之一,特别是当数据集规模增长时。正如我们之前的博客文章中所讨论的,当数据集规模…

两种方式实现Kepware与PLC之间的心跳检测

两种方式实现Kepware与PLC之间的心跳检测 实现Kepware与PLC之间的心跳检测1.OPCUA 外挂程序2.Kepware Advanced Tag 实现Kepware与PLC之间的心跳检测 1.OPCUA 外挂程序 这是通过上位程序来触发心跳的一种机制,在C#中,可以利用OPC UAOPCAutodll的方式…

python-leetcode-文本左右对齐

68. 文本左右对齐 - 力扣(LeetCode) class Solution:def fullJustify(self, words: List[str], maxWidth: int) -> List[str]:result []current_line []current_length 0for word in words:# 如果当前行加上这个单词后超过 maxWidth,则…

全新免押租赁系统打造便捷安全的租赁体验

内容概要 全新免押租赁系统的推出,标志着租赁行业的一次重大变革。这个系统的最大特点就是“免押金”,大大减轻了用户在租赁过程中的经济负担。从此,不再需要为一部手机或其他商品支付高昂的押金,用户只需通过简单的信用评估&…

WordPress静态缓存插件WP Super Cache与 WP Fastest Cache

引言 WordPress是一款开源的内容管理系统(CMS),最初作为博客平台开发,现已发展成为一个功能强大的建站工具,支持创建各种类型的网站,包括企业网站、在线商店、个人博客等。它具有用户友好的界面、丰富的插…

1.CSS的复合选择器

1.1 什么是复合选择器 在CSS中,可以根据选择器的类型把选择器分为基础选择器和复合选择器,复合选择器是建立在基础选择器之上,对基础选择器进行组合形成的。 复合选择器可以更精准、更高效的选择目标元素(标签) 复…

初学stm32 --- ADC模拟/数字转换器工作原理

目录 常见的ADC类型 并联比较型工作示意图 逐次逼近型工作示意图 ADC的特性参数 STM32各系列ADC的主要特性 ADC框图简介 参考电压/模拟部分电压 输入通道( F1为例) 转换序列(F1为例) 规则组和注入组执行优先级对比 规则…

【C++】深入理解迭代器(Iterator)

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯什么是迭代器?迭代器与指针的比较 💯std::string 中的迭代器示例代码与图示分析运行结果:图示说明: 小提示 💯正…

H266/VVC 帧内预测中 MDIS 技术

参考像素平滑滤波 MDIS VVC 的帧内预测参考像素获取过程和 HEVC 相同,但参考像素滤波过程有所改进。在H.266中 MDIS(Mode Dependent Intra Smoothing)即模式依赖帧内平滑滤波,是对帧内预测的亮度分量参考像素进行滤波决策的一个技…

Chrome访问https页面显示ERR_CERT_INVALID,且无法跳过继续访问

在访问网页的时候,因为浏览器自身的安全设置问题, 对于https的网页访问会出现安全隐私的提示, 甚至无法访问对应的网站,尤其是chrome浏览器, 因此本文主要讲解如何设置chrome浏览器的设置,来解决该问题&…

深入解析 Transformer:从原理到可视化再到PyTorch实现

文章目录 深入解析 Transformer1 理解 Transformer1.1 理解自注意力机制 (Self-Attention)1.2 理解位置编码 (Positional Encoding)1.2.1 整数编码1.2.2 正弦编码 1.3 理解编码器和解码器模块1.3.1 编码器 1.4 最终线性层和 Softmax 层 2 编写 Transformer 的代码2.1 摘要和引言…

系统架构设计师考点—软件工程基础知识

一、备考指南 软件工程基础知识主要考查的是软件工程基础、软件开发方法、系统分析、设计、测试及运行和维护等相关知识,同时也是重点考点,在系统架构设计师的考试中选择题12~15分,案例分析和论文中也会考到相关内容,属于重点章节…

电影动画shader解析与实现

着色器代码解析 大家好!我是 [数擎AI],一位热爱探索新技术的前端开发者,在这里分享前端和Web3D、AI技术的干货与实战经验。如果你对技术有热情,欢迎关注我的文章,我们一起成长、进步! 开发领域:…

使用ML.NET进行对象检测

1、前言 ML.NET 是面向 .NET 开发人员的开源跨平台机器学习框架,支持将自定义机器学习模型集成到 .NET 应用程序中。 它包含一个 API,其中包含不同的 NuGet 包、名为 模型生成器的 Visual Studio 扩展,以及作为 .NET 工具安装的 命令行接口。…

年会抽奖Html

在这里插入图片描述 <!-- <video id"backgroundMusic" src"file:///D:/background.mp3" loop autoplay></video> --> <divstyle"width: 290px; height: 580px; margin-left: 20px; margin-top: 20px; background: url(D:/nianhu…

vue -关于浏览器localstorge数据定期清除的实现

1.实现背景 用户登录时的信息存在了localstorge中&#xff0c;但它会一直存在。一般来说&#xff0c;我们希望这个数据能够定期被清除掉&#xff0c;以下一个定时清除的实现。 2.实现原理 在用户登录时&#xff0c;将用户信息存入localstorge的同时&#xff0c;将当前时间作…

LabVIEW水轮发电机组振动摆度故障诊断

本文介绍了基于LabVIEW的水轮发电机组振动摆度故障诊断系统的设计与实施过程。系统在通过高效的故障诊断功能&#xff0c;实现水轮发电机组的振动、温度等关键指标的实时监控与智能分析&#xff0c;从而提高电力设备的可靠性和安全性。 ​ 项目背景 随着电力行业对设备稳定性…

Collaborate with AI -- Write a modern C++ singleton factory

translate my blog <<与AI合作 -- 写一个modern c单例工厂>> to English. NOTE: It was written at 2024.01, maybe the AI is not smart as now. Preface In this article, readers can learn about a hybrid of the modern C singleton pattern and factory pat…

【轻松学C:编程小白的大冒险】--- C语言简介 02

在编程的艺术世界里&#xff0c;代码和灵感需要寻找到最佳的交融点&#xff0c;才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里&#xff0c;我们将共同追寻这种完美结合&#xff0c;为未来的世界留下属于我们的独特印记。 【轻松学C&#xff1a;编程小白的大冒险】…

下载b站高清视频

需要使用的edge上的一个扩展插件&#xff0c;所以选择使用edge浏览器。 1、在edge浏览器上下载 强力视频下载合并 扩展插件 2、在edge上打开b站&#xff0c;登录自己账号&#xff08;登录后才能下载到高清&#xff01;&#xff01;&#xff09;。打开一个视频&#xff0c;选择自…