【数据结构OJ题】相交链表

news2024/12/28 12:12:14

原题链接:https://leetcode.cn/problems/intersection-of-two-linked-lists/description/

目录

1. 题目描述

2. 思路分析

3. 代码实现


1. 题目描述

 

2. 思路分析

看到这道题,很容易想到的方法就是暴力求解,就是将一个链表的每个结点的地址分别和另外一个链表的每个结点的地址进行比较,如果有相等的,就说明相交了。(注意这里不能比值,因为两个不同的结点值有可能一样)。但是这样的时间复杂度太高了,为O(N^2)。

这道题有一个很好的做法:

先计算出两个链表的长度,让长的链表先走相差的长度,然后两个链表同时走,直到遇到相同的结点,即为第一个公共结点

我们定义了四个变量curA,curB,lenA,lenB。

我们用结构体指针curA遍历链表A,用结构体指针curB遍历链表B

lenA表示链表A的长度lenB表示链表B的长度

用while循环通过遍历分别得到了链表A和B的长度。

我们判断尾结点是否相等,如果尾结点相等,说明两个链表一定相交!!!

(我们看下图,如果两个链表相交,那么从这个相交的结点(包括这个交点)之后的结点,在两个链表中都是相等的。所以尾结点相等,说明两个链表一定相交。)

如果两个链表不相交curA!=curB),我们直接返回空指针NULL

如果两个链表相交,我们先让长的链表走两个链表长度的差距步(gap)。因为不知道两个链表哪个长,所以我们使用了abs()函数,差距步gap就是abs(lenA-lenB)。

之后我们又引入了两个结构体指针longListshortList分别指向长链表短链表的头。这里用了if语句判断先假设某个链表是长链表,如果不是,就让它等于短链表

然后我们用一个while循环让长链表走差距步while(gap--))。

然后让longList和shortList这两个结构体指针同时走找交点,找到交点时结束循环。

最后返回longList即可。

3. 代码实现

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    struct ListNode *curA=headA,*curB=headB;
    int lenA=1,lenB=1;
    //计算链表长度
    while(curA->next)
    {
        curA=curA->next;  
        ++lenA;
    }
    while(curB->next)
    {
        curB=curB->next;
        ++lenB;
    }
    //不相交
    if(curA!=curB)
        return NULL;
    int gap=abs(lenA-lenB);
    struct ListNode *longList=headA,*shortList=headB;
    if(lenA<lenB)
    {
        longList=headB;
        shortList=headA;
    }
    //长的先走差距步
    while(gap--)
    {
        longList=longList->next;
    }
    //同时走找交点
    while(longList!=shortList)
    {
        longList=longList->next;
        shortList=shortList->next;
    }
    return longList;
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Spring专题】Spring之Bean的生命周期源码解析——阶段二(一)(IOC之实例化)

目录 前言阅读准备阅读指引阅读建议 课程内容一、SpringIOC之实例化1.1 简单回顾1.2 概念回顾1.3 核心方法讲解 二、方法讲解2.1 AbstractBeanFactory#getMergedLocalBeanDefinition&#xff1a;合并BeanDefinition2.2 AbstractAutowireCapableBeanFactory#createBean&#xff…

iOS 17 测试版中 SwiftUI 视图首次显示时状态的改变导致动画“副作用”的解决方法

问题现象 精彩的 SwiftUI 动画可以让我们的 App 活灵活现、精妙绝伦。不过原本正常的动画在测试版本的 iOS 里却有着让码农持续秃头的“副作用”&#xff1a; 我们希望在视图首次显示时驱动状态改变来产生橘色小球围绕红球旋转的动画&#xff0c;红球应该始终保持在屏幕中心。…

Flink的Standalone部署实战

在Flink是通用的框架&#xff0c;以混合和匹配的方式支持部署不同场景&#xff0c;而Standalone单机部署方便快速部署&#xff0c;记录本地部署过程&#xff0c;方便备查。 环境要求 1&#xff09;JDK1.8及以上 2&#xff09;flink-1.14.3 3&#xff09;CentOS7 Flink相关信…

腾讯24届校招内推

校招开始啦&#xff5e;有兴趣的话可以扫我的码投&#xff0c;也可以分享给身边找工作的同学&#xff5e; ❤投递攻略 1️⃣腾讯校招步骤&#xff0c;先微信扫码绑定内推关系&#xff0c;后在电脑上上传更改简历和部门投递 2️⃣投递时将选择投递部门&#xff0c;投递后将在…

实战项目-在线学院 阿里云视频的操作

一 阿里云视频 1.1 阿里视频上传 1.2 阿里云视频上传

Vue3 Vuex状态管理多组件传递数据简单应用

去官网学习→安装 | Vuex cd 项目 安装 Vuex&#xff1a; npm install --save vuex 或着 创建项目时勾选Vuex vue create vue-demo ? Please pick a preset: Manually select features ? Check the features needed for your project: (Press <space> to se…

RocketMQ主题下的队列只有两个被订阅

一、场景 主题下的队列只有两个被订阅 二、消费者 一共有两个消费者 Consumer1 所在消费组&#xff1a;C_TEST_1订阅主题&#xff1a;fsc_wb_ccs_web_orderly_84 Consumer2 所在消费组&#xff1a;C_TEST_1订阅主题&#xff1a;fsc_wb_ccs_web_84 三、原因 两个不同的消…

预演攻击:谁需要网络靶场,何时需要

"网络演习 "和 "网络靶场 "几乎是当今信息安全领域最流行的词汇。与专业术语不同的是&#xff0c;这些词对于企业和高级管理人员来说早已耳熟能详&#xff1a;法律要求他们进行演习&#xff0c;包括网络演习&#xff0c;而网络射击场也经常在企业界和媒体上…

数据生成 | MATLAB实现WGAN生成对抗网络数据生成

数据生成 | MATLAB实现WGAN生成对抗网络数据生成 目录 数据生成 | MATLAB实现WGAN生成对抗网络数据生成生成效果基本描述程序设计参考资料 生成效果 基本描述 1.WGAN生成对抗网络&#xff0c;数据生成&#xff0c;样本生成程序&#xff0c;MATLAB程序&#xff1b; 2.适用于MATL…

美能达打印机刷卡扫描文件后,用户收不到扫描邮件

环境: 柯尼卡美能达一体机 bizhub 287 域服务器 Windows server 2019 问题描述: 新员工在域服务器创建账户后同步到打印服务器上面,他们在打印机扫描文件后,自动发邮件那个邮箱上没有他们邮件,导致他们也收不到邮件 正常是用户在打印机上刷卡后扫描件文件为PDF格式,…

Jmeter 连接 MySQL 数据库脚本

1、创建线程组 2、创建 JDBC Connection Configuration 3、创建 JDBC Request 4、最终创建的目录 5、重点来了 5.1 在百度中下载个 MySQL-connector-Java-8.0.28.jar&#xff0c;放在 jmeter 的 bin 目录下 5.2 在测试计划中&#xff0c;将 jar 包添加到脚本中 5.3 输入参…

您可以购买 Banana Pi BPI-CM2 而不是 Raspberry Pi CM4。它提供什么?

最近&#xff0c;Banana Pi&#xff08;SINOVOIP&#xff09;推出了Banana Pi BPI-CM2系统级模块&#xff08;SoM&#xff09;。BPI-CM2 是类似于Raspberry Pi CM4 的计算模块&#xff0c;提供一系列令人印象深刻的功能。Banana BPI-CM2 SoM 采用Rockchip RK3568四核 Cortex-A5…

MMdetection在VisDrone2019上训练FCOS和CenterNet

配置环境 Python 3.5>PyTorch 1.1>CUDA 9.0NCCL 2>GCC 4.9mmcv‘’ 把mmdetection的代码下载下来 git clone https://github.com/open-mmlab/mmdetection.git进入这个mmdetection文件,准备编译mmdetection的文件 cd mmdetection 装一下下面这些包&#xff0c; #…

Three.js--》✨ 阳 光 dua 郎 大 男 孩 ✨——阿伟的自述

不要让鲲流太嚣张&#xff0c;我们杰流才是最弔的 ———— 阳光dua郎大男孩 目录 项目搭建 初始化three.js基础代码 获取项目所需素材 加载图片语音模型 今天简单实现一个three.js的3D故事小游戏&#xff0c;加强自己对three知识的掌握与学习&#xff0c;只有在项目中才能…

YOLOv5基础知识入门(7)— NMS(非极大值抑制)原理解析

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。NMS是指非极大值抑制&#xff08;non maximum suppression&#xff09;&#xff0c;它是一种常用于物体检测任务的算法。在物体检测中&#xff0c;通常会有多个预测框&#xff08;bounding box&#xff09;被提议出来&…

3D图像驱动live2d--Kalidokit--人脸动作捕捉

3D图像驱动live2d–Kalidokit 可在线实时根据摄像头中人脸动作实现动作捕捉 Kalidokit https://kit.kalidoface.com/live2d/ https://github.com/yeemachine/kalidokit

Spring系列篇--关于AOP【面向切面】的详解

目录 一.AOP是什么 二.案例演示 1.前置通知1.1 先准备接口 1.2然后再准备好实现类 1.3对我们的目标对象进行JavaBean配置 1.4 编写前置系统日志通知 1.5配置系统通知XML中的JavaBean 1.6 配置代理XML中的JavaBean 1.7 测试代码开始测试 注意这里有一个报错问题&…

谷歌在Chrome浏览器中推进抗量子加密技术

近日&#xff0c;Chromium博客上发表的一篇博文称&#xff0c;为了加强网络安全&#xff0c;应对迫在眉睫的量子计算机威胁&#xff0c;谷歌各个团队密切合作&#xff0c;为网络向抗量子密码学的过渡做好准备。 谷歌的Chrome团队在博客中写道&#xff0c;该项目涉及修订技术标准…

python3实现线性规划求解

Background 对于数学规划问题&#xff0c;有很多的实现。MatlabYALMIPCPLEX这个组合应该是比较主流的&#xff0c;尤其是在电力相关系统中占据着比较重要的地位。MATLAB是一个强大的数值计算工具&#xff0c;用于数学建模、算法开发和数据分析。Yalmip是一个MATLAB工具箱&#…

VS2022 CMake报错解决小结

目录 一、问题背景 二、问题分析 三、问题解决 一、问题背景 VS2022中能够跨平台的工程类型就是CMake项目&#xff0c;一套代码能跨windows/Linux/Mac多种操作系统。而实际使用时&#xff0c;发现相关资料比较少&#xff0c;需要摸索一下。 碰到的问题简述&#xff1a; 1、C…