当前位置: 首页 > news >正文

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

文章目录

    • 两个链表的第一个公共结点
      • 问题描述
      • 示例说明
        • 示例 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;

相关文章:

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

文章目录 两个链表的第一个公共结点问题描述示例说明示例 1示例 2 方法及实现方法描述代码实现 复杂度分析示例运行过程示例 1示例 2 总结备注 两个链表的第一个公共结点 问题描述 给定两个无环的单向链表,找到它们的第一个公共节点。如果没有公共节点&#xff0c…...

细说STM32F407单片机以轮询方式读写外部SRAM的方法

目录 一、实例的功能 二、工程配置 1、KEYLED 2、时钟、DEBUG、USART6、NVIC、GPIO、CodeGenerator 3、FSMC (1) 模式设置 (2) Bank 1子区3参数设置 1) NOR/PSRAM control组,子区控制参数 2) NOR/PSRAM timi…...

【3】安装cyclictest和iperf

cyclictest 安装比较简单,我是直接使用命令行: apt-get install rt-tests 随后,运行 sudo cyclictest 但是这个程序会一直运行,直到你手动中断程序,而且每秒生成一行输出也很烦人,所以可以选择把结果…...

C语言将点分十进制的IP字符串转成4个整数

最近在做lldp的snmp返回值时需要做这样的转换处理:C语言将点分十进制的IP字符串转成4个整数。 这里用两种方式: sscanf格式化处理用 inet_aton函数将ip字符串转成32位的整形,然后再根据bit转成对应的4个整数。 man命令可以确认下sscanf和i…...

go语言学习 笔记 1(变量,语法,数据类型)

1,包管理 一个文件夹可以称为一个包 在一个包里面可以创建多个文件 包中可以创建包 同一个包内的同一级的包的名字要相同 如:包a中的包b.包b中的包得是同一个package,a中和包b同级的包名字也得是一个名字 必须要有一个main包,入口,就像是c必须有一个main函数 如果没有mai…...

无网络时自动切换备用网络环境

目录 背景目标为什么需要做自动网络切换网络切换手段 网络环境实现思路和代码部署脚本开机自动执行附录连接两个网络时的路由问题 背景 目标 学校实验室有两个网络环境,我电脑使用网线连接稳定但低速的网络A,使用WiFi连接高速但不稳定的网络B。因此&am…...

电脑32位和64位之区别(Difference between 32-Bit and 64 Bit Computers)

电脑32位和64位之区别 很多小伙伴还不知道电脑32位和64位是什么意思,今天小编就来普及一下。 32位和64位是指电脑处理器(CPU)和操作系统的架构,决定了电脑如何处理数据、存储信息、运行程序等。 32位和64位是指电脑系统中每个处…...

系统思考—结构影响行为

前段时间,我遇到了一位健康食品初创公司的创始人,产品质量毋庸置疑,但销量却始终打不开局面,资金链也日渐紧绷。他一脸困惑地问我:“我们已经尽力了,为什么结果还是不如人意?”经过深入交流&…...

【算法不挂科】算法期末考试【选择题专项练习】<多单元汇总>

前言 大家好吖,欢迎来到 YY 滴算法不挂科系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 下面是相关传送门 【算法不挂科】算法期末考试题库1(带解析)【选择题53道&填空题36道&算法填空题7道&a…...

2025.1.8(c++对c语言的扩充——堆区空间,引用,函数)

笔记 上一笔记接续(练习2的答案) 练习:要求在堆区连续申请5个int的大小空间用于存储5名学生的成绩,分别完成空间的申请、成绩的录入、升序排序、成绩输出函数以及空间释放函数,并在主程序中完成测试 要求使用new和d…...

如何将Yum源修改为本地挂载的ISO镜像

要将yum源修改为本地挂载的ISO镜像,您可以按照以下步骤进行操作。假设您使用的是CentOS或类似的基于Red Hat的Linux发行版,且已经将ISO镜像文件挂载到系统中。 步骤一:挂载ISO镜像 创建一个挂载点: 首先,您需要创建一个目录来作为ISO镜像的挂载点。例如: sudo mkdir /mnt…...

salesforce如何在系统里保存密码

在 Salesforce 中,保存密码或类似敏感信息时,不应以明文形式存储,而应采用安全的加密和存储机制。以下是一些最佳实践和实现方法: 1. 使用 Salesforce 提供的加密机制 Salesforce 提供了一些内置的加密工具,可以用来加…...

函数提升+上下文+内存清理及释放

文章目录 函数提升上下文函数释放拓展-垃圾回收机制垃圾回收之触发应用 函数提升上下文 函数提升(Hoisting) 概念:在JavaScript中,函数声明会被提升到当前作用域的顶部。这意味着可以在函数声明之前调用函数。例如: sa…...

计算机网络之---计算机网络的性能评估

计算机网络的性能评估是指通过各种标准和指标来衡量网络的工作效率和质量,进而对网络进行优化和改进的过程。评估的目标是确保网络能够满足预期的服务质量(QoS)和性能需求。常见的计算机网络性能评估指标包括带宽、延迟、吞吐量、丢包率等。 …...

Unity学习之UGUI进阶

一、事件监听接口 1、作用 用于实现类型长按、双击、拖拽等基础控件无法实现的功能 所有控件都能够添加更多的事件监听来处理对应的逻辑 2、事件监听接口类型 (1)常用事件接口 (2)不常用事件接口 3、使用事件监听接口 &#…...

深度学习领域创新黑马!频域特征融合新突破

最近,FreqFusion引起了广泛关注,这是一种创新的频率感知特征融合方法,可以提升数据处理的准确性和效率,尤其在语义分割、目标检测、实例分割和全景分割等任务中表现卓越。 通过结合频域分析与特征融合技术,FreqFusion…...

路由器的转发表

【4-24】 已知路由器R₁ 的转发表如表T-4-24 所示。 表T-4-24 习题4-24中路由器R₁的转发表 前缀匹配 下一跳地址 路由器接口 140.5.12.64/26 180.15.2.5 m2 130.5.8/24 190.16.6.2 ml 110.71/16 ----- m0 180.15/16 ----- m2 190.16/16 ----- ml 默认 11…...

用Cline打造你的智能搜索助手:Tavily Search MCP集成指南

引言 本文将详细介绍如何在Cline编辑器中集成Tavily Search智能搜索功能。我们将从MCP(Model Context Protocol)协议基础开始,深入探讨Tavily Search MCP服务器的安装配置、使用方法,以及进阶的二次开发技巧。无论你是AI开发者还…...

HTML+CSS+JS制作中华传统美食主题网站(内附源码,含5个页面)

一、作品介绍 HTMLCSSJS制作一个中华传统文化主题网站,包含首页、菜系页、食材页、名厨页、美食故事页等5个静态页面。其中每个页面都包含一个导航栏、一个主要区域和一个底部区域。 二、页面结构 1. 顶部横幅导航区 包含网站Logo、搜索栏、主导航菜单&#xff0…...

黄仁勋CES 2025演讲重点内容

黄仁勋CES 2025演讲重点内容 硬件产品发布 GeForce RTX 50系列GPU: 架构与性能提升:正式发布的新一代GeForce RTX 50系列GPU采用英伟达旗舰的Blackwell架构,这是自25年前引入可编程着色技术以来计算机图形领域最重大的创新。该系列显卡在图形…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

蓝桥杯 冶炼金属

原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...

CSS | transition 和 transform的用处和区别

省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

Vue ③-生命周期 || 脚手架

生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...

阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)

cd /home 进入home盘 安装虚拟环境: 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境: virtualenv myenv 3、激活虚拟环境(激活环境可以在当前环境下安装包) source myenv/bin/activate 此时,终端…...