LeetCode-热题100:160. 相交链表

给你两个单链表的头节点 headAheadB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null

图示两个链表在节点 c1 开始相交:

在这里插入图片描述

题目数据 保证 整个链式结构中不存在环。

注意,函数返回结果后,链表必须 保持其原始结构

自定义评测:

评测系统 的输入如下(你设计的程序 不适用 此输入):

  • intersectVal - 相交的起始节点的值。如果不存在相交节点,这一值为 0
  • listA - 第一个链表
  • listB - 第二个链表
  • skipA - 在 listA 中(从头节点开始)跳到交叉节点的节点数
  • skipB - 在 listB 中(从头节点开始)跳到交叉节点的节点数
    评测系统将根据这些输入创建链式数据结构,并将两个头节点 headAheadB 传递给你的程序。如果程序能够正确返回相交节点,那么你的解决方案将被 视作正确答案

示例 1:
在这里插入图片描述

输入: intersectVal = 8, listA = [4,1,8,4,5], listB = [5,6,1,8,4,5], skipA = 2, skipB = 3
输出: Intersected at ‘8’
解释: 相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,6,1,8,4,5]。
在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。
— 请注意相交节点的值不为 1,因为在链表 A 和链表 B 之中值为 1 的节点 (A 中第二个节点和 B 中第三个节点) 是不同的节点。换句话说,它们在内存中指向两个不同的位置,而链表 A 和链表 B 中值为 8 的节点 (A 中第三个节点,B 中第四个节点) 在内存中指向相同的位置。

示例 2:

在这里插入图片描述

输入: intersectVal = 2, listA = [1,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1
输出: Intersected at ‘2’
解释: 相交节点的值为 2 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [1,9,1,2,4],链表 B 为 [3,2,4]。
在 A 中,相交节点前有 3 个节点;在 B 中,相交节点前有 1 个节点。

示例 3:
在这里插入图片描述

输入: intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2
输出: null
解释: 从各自的表头开始算起,链表 A 为 [2,6,4],链表 B 为 [1,5]。
由于这两个链表不相交,所以 intersectVal 必须为 0,而 skipA 和 skipB 可以是任意值。
这两个链表不相交,因此返回 null 。

提示:

  • listA 中节点数目为 m
  • listB 中节点数目为 n
  • 1 <= m, n <= 3 * 104
  • 1 <= Node.val <= 105
  • 0 <= skipA <= m
  • 0 <= skipB <= n
  • 如果 listA 和 listB没有交点,intersectVal 为 0
  • 如果 listA 和 listB 有交点,intersectVal == listA[skipA] == listB[skipB]

代码及注释

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func getIntersectionNode(headA, headB *ListNode) *ListNode {
    // 如果链表A或链表B为空,直接返回nil
    if headA == nil || headB == nil {
        return nil
    }

    // 初始化两个指针
    slow, fast := headA, headB

    // 循环,直到找到交点或两个指针都到达链表的尾部
    for slow != fast {
        // 如果fast指针没有到达链表B的尾部,就继续向前移动
        if fast != nil {
            fast = fast.Next
        } 
        // 如果fast指针到达了链表B的尾部,就将其重新指向链表A的头部
        else {
            fast = headA
        }

        // 如果slow指针没有到达链表A的尾部,就继续向前移动
        if slow != nil {
            slow = slow.Next
        } 
        // 如果slow指针到达了链表A的尾部,就将其重新指向链表B的头部
        else {
            slow = headB
        }
    }

    // 返回两个链表的交点
    return slow
}

代码解释

利用两个指针 slowfast,分别从两个链表的头部开始遍历,当某一个指针到达链表的尾部时,将其重新指向另一个链表的头部。这样,当两个指针相遇时,就是两个链表的交点。

  1. 初始化指针:

    • slowfast 指针分别指向链表A和链表B的头部。
  2. 循环查找交点:

    • slowfast 指针不相同时,执行循环。
    • 如果 fast 指针没有到达链表B的尾部,就继续向前移动。
    • 如果 fast 指针到达了链表B的尾部,就将其重新指向链表A的头部。
    • 如果 slow 指针没有到达链表A的尾部,就继续向前移动。
    • 如果 slow 指针到达了链表A的尾部,就将其重新指向链表B的头部。
  3. 返回交点:

    • slowfast 指针相同时,返回两个链表的交点。

这个算法的时间复杂度是O(m + n),其中m和n分别是链表A和链表B的长度。这是一个非常高效的方法,因为它在每次迭代中都排除了一部分链表,直到找到交点或者遍历完整个链表。

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

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

相关文章

“美国债务螺旋上升,每百天膨胀万亿”!华尔街:投入比特币是明智之举,美元早晚垮台?

​ 前不久&#xff0c;黄金和比特币价格的双双逼近历史高位&#xff0c;再度吸引了不少金融市场参与者的关注。虽然这两类资产大涨的背后&#xff0c;有着诸如比特币减半临近、地缘局势引发避险等各自的原因&#xff0c;但也有一些业内人士提到了美国政府债务规模激增等无法回…

day_2FreeRTOS使用PWM+ADC光敏电阻完成光控灯实验

主要代码&#xff1a; int adc_val0;//保存ADC采集到的数值 float volt0;//保存电压值HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_3);//打开定时器的PWM通道3 TIM3->CCR30;//改变CCR的值&#xff0c;范围0——999&#xff0c;不能超过ARRwhile (1){ HAL_ADC_Start(&had…

小米SU7又“赢麻了”对标雷军的爽文人生:天选成功人士

会议之眼 快讯 2024年3月28日&#xff0c;小米SU7汽车盛大发布&#xff0c;吸引了众多关注者。SU7标准版售价21.59万元&#xff0c;Pro版24.59万元&#xff0c;Max版本29.99万元&#xff0c;全部控制在30万元以内。发布会场面火爆&#xff0c;各大车企领导齐聚&#xff0c;雷军…

OMP压缩感知仿真(MATLAB)

clc; clearvars; close all;% 读文件 Ximread(mandrill256.bmp); tic; Xdouble(X); [m,n]size(X);% % 小波变换矩阵生成 [LL1, LH1, HL1, HH1] dwt2(X, haar); [LL2, LH2, HL2, HH2] dwt2(LL1, haar); % [LL3, LH3, HL3, HH3] dwt2(LL2, haar); % [LL4, LH4, HL4, HH4] d…

ObjectiveC-07-OOP面向对象程序设计基础

OOP&#xff08;面向对象程序设计&#xff09;是一个简单又复杂的课题&#xff0c;之所以简单是因为其概念清晰&#xff0c;内容简单&#xff0c;之所以复杂是因为没有固定的模式可寻&#xff0c;正所谓千人千面。 从本节开始&#xff0c;笔者大概会用5篇左右不同的专题来讲解O…

虚拟机ip不停地变每次使用ssh不好登录?有手就行!

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 虚拟机ip不停地变每次使用ssh不好登录&#xff1f;有手就行&#xff01; 桥接模式下固定ip&#xff1f;NoAvahi服务&#xff0c;你值得拥有Avahi解决方案虚拟机中配置Avahi服务配置成功展示测试成功 桥…

MySQL故障排查与生产环境优化

一、MySQL逻辑架构图 客户端和连接服务核心服务功能存储引擎层数据存储层 二、MySQL故障排查 1、MySQL单实例故障排查 故障一 故障现象&#xff1a; ERROR 2002 (HY000): Cant connect to local MySQL server through socket /data/mysql/mysql.sock (2)问题分析&#xff…

使用Pollard_rho算法分解质因数

分解质因数的朴素算法 最简单的算法即为从 [2, sqrt&#xff08;N&#xff09;] 进行遍历。 vector<int> breakdown(int N) {vector<int> result;for (int i 2; i * i < N; i) {if (N % i 0) { // 如果 i 能够整除 N&#xff0c;说明 i 为 N 的一个质因子。…

求组合背包II(acwing)

题目描述&#xff1a; 给定n组循问&#xff0c;每组询问给定两个整数a&#xff0c;b&#xff0c;请你输出Ca^b mod (1e9 7)的值&#xff0c;。 输入格式&#xff1a; 第一行包含整数n。 接下来2行&#xff0c;每行包含一组a和b。 输出格式&#xff1a; …

Vscode下使用markdown入门

1.安装vscode插件 1. **Markdown All in One** ——提供丰富的Markdown相关的快捷键、自动补全功能&#xff0c;提高md文档编写生产力 2. **Markdown Preview Ehanced** ——用于渲染当前编写文档的效果同步预览 3. **Paste Image** ——用于快速引用图片至Markdown文…

视频素材库有哪些网站?八大平台视频素材库创作推荐

视频创作的小达人们&#xff0c;是不是经常在想&#xff0c;视频素材库有哪些网站能提供高质量的素材呢&#xff1f;别担心&#xff0c;今天我要为你们揭秘八个超棒的视频素材网站&#xff0c;让你的视频制作更加轻松在创作的路上如鱼得水&#xff01; 蛙学网&#xff1a;海量…

【tensorflow框架神经网络实现鸢尾花分类_Keras】

文章目录 1、前言2、鸢尾花分类3、结果打印 1、前言 【tensorflow框架神经网络实现鸢尾花分类】一文中使用自定义的方式&#xff0c;实现了鸢尾花数据集的分类工作。在这里使用tensorflow中的keras模块快速、极简实现鸢尾花分类任务。 2、鸢尾花分类 import tensorflow as t…

.DevicData-P-XXXXXXXX勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复

导言&#xff1a; 随着信息技术的飞速发展&#xff0c;网络安全问题日益突出&#xff0c;其中勒索病毒成为了一种日益严重的威胁。.DevicData-P-XXXXXXXX勒索病毒就是其中一种典型的恶意软件&#xff0c;它通过加密用户文件并要求赎金来解锁的方式&#xff0c;给企业和个人带来…

【Java项目】基于SpringBoot的【心灵治愈交流平台】

目录 背景 技术简介 系统简介 界面预览 背景 随着网络不断的普及发展&#xff0c;心灵治愈交流平台依靠网络技术的支持得到了快速的发展&#xff0c;首先要从用户的实际需求出发&#xff0c;通过了解用户的需求开发出具有针对性的首页、系统公告、心理咨询师、心灵专栏、压…

基于springboot实现网上点餐系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现网上点餐系统演示 摘要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于网上点餐系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了网上点餐系统…

【了解下Oracle】

&#x1f308;个人主页:程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

网络安全入门教程(非常详细)从零基础入门到精通!

网络安全是一个庞大而不断发展的领域&#xff0c;它包含多个专业领域&#xff0c;如网络防御、网络攻击、数据加密等。介绍网络安全的基本概念、技术和工具&#xff0c;逐步深入&#xff0c;帮助您成为一名合格的网络安全从业人员。 一、网络安全基础知识 1.计算机基础知识 …

java(4)之运算符

1、算术运算符 运算符含义表达式加11-减1-1*乘1*2/除2/1%取余5%2 2、赋值运算符 即 表示将右边的值赋给左边的变量 即 int i &#xff1b; i 1&#xff1b; 运算符含义 表达式 x xyxy-x x-yx - y*x x*yx*y/x x/yx /y%x x%yx %y 代码示例 public class Main {pub…

芒果YOLOv5改进89:卷积SPConv篇,即插即用,去除特征图中的冗余,FLOPs 和参数急剧下降,提升小目标检测

芒果专栏 基于 SPConv 的改进结构,改进源码教程 | 详情如下🥇 👉1. SPConv 结构、👉2. CfSPConv 结构 💡本博客 改进源代码改进 适用于 YOLOv5 按步骤操作运行改进后的代码即可 即插即用 结构。博客 包括改进所需的 核心结构代码 文件 YOLOv5改进专栏完整目录链接:…

环境配置——已解决ModuleNotFoundError: No module named ‘cv2’(python)

一、报错代码 在网上搜到不少用Python处理图形的代码&#xff0c;于是复制别人的代码直接运行却报错&#xff0c;得到的结果却是&#xff1a;已解决ModuleNotFoundError: No module named ‘cv2’。&#xff08;当时心里瞬间凉了一大截&#xff0c;最后顺利解决了&#xff0c;顺…