每日一题---OJ题: 相交链表

片头

嗨! 小伙伴们,大家好! 今天我们来一起学习这道OJ题---相交链表,准备好了吗? Ready Go!  !  !

emmm,看这道题好像不怎么难,我们一起画图分析分析 

上图中,A链表有5个结点,分别为 a1,a2,c1,c2,c3 ; B链表有6个结点,分别为 b1,b2,b3,c1,c2,c3 ; A链表和B链表在c1结点相交

怎么做这道题呢? 第一种思路就是暴力穷举,也是一种比较容易想到的办法

思路一: 让A链表的每一个结点依次跟B链表中的结点进行比较,如果有相等就是相交,第一个相等就是交点。

代码如下:

 typedef struct ListNode ListNode;
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {ListNode* pA = headA;   //定义一个指向A链表的指针ListNode* pB = headB;   //定义一个指向B链表的指针//让A链表的每一个结点依次和B链表中的结点进行比较for(pA = headA; pA != NULL; pA = pA->next){for(pB = headB; pB != NULL; pB = pB->next){if(pA == pB){   //如果有相等就是相交return pA;  //第一个相等就是交点}}}return NULL;            //如果没有相交,返回NULL
} 

我们把代码放到leetcode上面,显示通过

那还没有另外一种思路呢? 肯定有,且听我慢慢道来~

思路二:  1. 判断是否相交先找尾结点,尾结点的地址相同就相交; 2.找交点 长的链表先走长度差,再同时走找交点(第一个地址相同的就是交点)。

判断是否相交的代码如下:(因为后面我们需要知道长度差,因此在寻找尾结点的同时就计算链表的长度,效率更高)

        ListNode* pA = headA;       //定义pA指针,指向A链表的头结点ListNode* pB = headB;       //定义pB指针,指向B链表的头结点int lenA = 0;               //A链表的长度while(pA->next != NULL)     //寻找A链表的尾结点{pA = pA->next;          //如果不是尾结点,pA往后走一步lenA++;                 //lenA的长度自增一次}lenA = lenA+1;              //别忘了加上尾结点int lenB = 0;                //B链表的长度while(pB->next != NULL)      //寻找B链表的尾结点{pB = pB->next;           //如果不是尾结点,pB往后走一步lenB++;                  //lenA的长度自增一次}lenB = lenB+1;               //别忘了加上尾结点if(pA != pB){                //如果尾结点不相同,说明两个链表不会相交return NULL;             //返回NULL}

接下来就是尾结点相同,说明两个链表相交,我们一起来找交点

部分代码如下: 

 //尾结点相同,说明两个链表相交,我们一起来找交点int gap = abs(lenA-lenB);   //abs()函数用来求绝对值//假设A链表的长度比B链表短//用变量shortList定义A链表,变量longList定义B链表ListNode* shortList = headA;ListNode* longList = headB;//如果A链表的长度比B链表长if(lenA > lenB){longList = headA;  //变量longList定义A链表shortList = headB;//用变量shortList定义B链表,}//长的链表先走长度差while(gap--){longList = longList->next;}//再同时走找交点while(longList != shortList){longList = longList->next;shortList = shortList->next;}//找到交点了,返回结点return longList;

OK,这道题被我们解决了,整体代码如下:

typedef struct ListNode ListNode;
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {ListNode* pA = headA;       //定义pA指针,指向A链表的头结点ListNode* pB = headB;       //定义pB指针,指向B链表的头结点int lenA = 0;               //A链表的长度while(pA->next != NULL)     //寻找A链表的尾结点{pA = pA->next;          //如果不是尾结点,pA往后走一步lenA++;                 //lenA的长度自增一次}lenA = lenA+1;              //别忘了加上尾结点int lenB = 0;                //B链表的长度while(pB->next != NULL)      //寻找B链表的尾结点{pB = pB->next;           //如果不是尾结点,pB往后走一步lenB++;                  //lenA的长度自增一次}lenB = lenB+1;               //别忘了加上尾结点if(pA != pB){                //如果尾结点不相同,说明两个链表不会相交return NULL;             //返回NULL}//尾结点相同,说明两个链表相交,我们一起来找交点int gap = abs(lenA-lenB);   //abs()函数用来求绝对值//假设A链表的长度比B链表短//用变量shortList定义A链表,变量longList定义B链表ListNode* shortList = headA;ListNode* longList = headB;//如果A链表的长度比B链表长if(lenA > lenB){longList = headA;  //变量longList定义A链表shortList = headB;//用变量shortList定义B链表,}//长的链表先走长度差while(gap--){longList = longList->next;}//再同时走找交点while(longList != shortList){longList = longList->next;shortList = shortList->next;}//找到交点了,返回结点return longList;
} 

哈哈哈,代码量看似很多,但是里面的逻辑一点也不复杂,只要认真分析,一定能克服难关!

片尾

今天我们学习了一道OJ题: 相交链表,里面运用到了计算链表的长度,查找链表的尾结点以及比较两个链表的结点等相关知识,希望看完这篇文章能对友友们有所帮助 !    !    !

点赞收藏加关注 !   !   !

谢谢大家 !   !   !

 

 

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

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

相关文章

渗压计在测压管与测井中的安装方法

在地下水动态监测与工程安全评估中,渗压计扮演着至关重要的角色。它能够精准地测量地下水压力的变化,为工程师提供决策依据。本文将详细阐述在测压管或测井中如何正确安装渗压计,以确保其准确度和可靠性。 一、建立零读数并浸透透水石 在安装…

PandasAI的应用与实战解析(一):环境安装、运行demo

文章目录 1.源码包下载、明确依赖版本2.安装python依赖3.运行demo 本博客源码仓库地址:gitlab,本篇博客对应01分支python版本为3.10.x 什么是PandasAI?一句话总结的话,PandasAI就是一个结合了Pandas和AI的开源工具,更…

windwos安全加固

一、账号管理 按用户类型分配账号 目的:根据系统要求,设定不同账户和组,管理员、数据库 sa、审计用户、来宾用户等 实施方法: 打开本地用户和计算机管理器 ​ 1.打开运行,输入lusrmgr.msc 2.根据用户要求将账户加入…

秋招算法刷题7

20240410 1.接雨水 方法一,动态规划,时间复杂度O(n^2),空间复杂度O(n) public int trap(int[] height) { int nheight.length; if(n0){ return 0; } …

java:字符集和字符流

字符集 规定了字符和二进制之间对应关系的一张表 字节是计算机最基本的存储单位 字符则是通过字符组成和编码而成的文本 常见字符集 1,ASCII字符集 基础字符编码标准,包含128个字符,只包括英文字母,数字和一些常见的符号 一个字节表示一个字符 所有的字符集均兼容ASCII…

open-sora

Open-Sora,高效复现类Sora视频生成方案开源!魔搭社区最佳实践教程来啦!https://mp.weixin.qq.com/s/WMQIDgZs2MBPGtx18XSXgw Open-Sora开源方案讲解开源但“平替”的方案。https://mp.weixin.qq.com/s/nPYCzgBA7hIsPZ6PCyXxKQOpen-Sora/docs…

数据分析案例(一):地区收入的PCA主成分分析

练习1 地区收入的PCA主成分分析 0.变量说明 1.导包操作 核心思路:导入基础数据操作库包,PCA、k-means 库包,数据可视化库包 import pandas as pd import numpy as np from sklearn.decomposition import PCA from sklearn.preprocessing i…

YOLOV5训练KITTI数据集实践

目录 一、YOLOV5下载安装二、KITTI数据集三、标签格式转换四、修改配置文件五、训练六、测试 一、YOLOV5下载安装 git clone https://github.com/ultralytics/yolov5.git conda create -n yolov5 python3.8 -y conda activate yolov5 cd yolov5 pip install -r requirements.t…

2024最火的情感短视频素材在哪下载?这里有几个素材网站可以下载

在这个看似无边无际的短视频海洋中,我就像那个手握罗盘、脚踏破旧木筏的勇敢航海家,时刻准备着发现新大陆。而我的罗盘,就是那些能够指引我找到珍稀素材的网站。让我带你领略一下我的航海日记吧。九才素材网: 九才素材网提供了丰…

青少年体能素质教育平台

一、项目背景与意义 随着社会的快速发展和人们生活水平的提高,青少年体能素质教育逐渐受到社会各界的广泛关注。体能素质作为青少年全面发展的重要组成部分,对于提升他们的健康水平、增强自信心、培养团队协作精神和创新能力具有重要意义。然而&#xf…

继承【C/C++复习版】

目录 一、什么是继承?怎么定义继承? 二、继承关系和访问限定符? 三、基类和派生类对象可以赋值转换吗? 四、什么是隐藏?隐藏vs重载? 五、派生类的默认成员函数? 1)派生类构造函…

关于转义符 \ 在php正则中的匹配问题

今天做题遇到一个很经典的问题&#xff0c;记录一下&#xff0c;先看一段代码 <?php $str&#xff0c;&#xff0c;"\\"; $pattern&#xff0c;&#xff0c;"/\\/"; if(preg_match($partern,$str,$arr)) { &#xff0c;&#xff0c;&#xff0c;&…

SpringBoot编写一个SpringTask定时任务的方法

1&#xff0c;在启动类上添加注解 EnableScheduling//开启定时任务调度 2&#xff0c; 任务&#xff08;方法&#xff09;上也要添加注解&#xff1a; Scheduled(cron " 0 * * * * ? ") //每分钟执行一次 域&#xff1a; 秒 分 时 日 月 周 &#xff08;年&#…

如何修复在Deepin系统中因`apt-get autoremove systemd`导致的启动问题

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

选择正确的Go Module Path

最近我在查看项目代码时&#xff0c;注意到有人在go.mod文件中将module path写为com.example.foo了。根据这个写法&#xff0c;相信屏幕前的读者也可以推断出这位开发人员可能是从Java阵营转到Go的。实际开发中可能有很多开发者会使用类似的内容作为module path&#xff0c;但这…

Jmeter针对多种响应断言的判断

有时候response返回的结果并非一种&#xff0c;有多种&#xff0c;需要对这几种进行判断的时候需要使用Bean Shell。 &#xff08;1&#xff09;首先获取响应数据 String response prev.getResponseDataAsString(); ResponseCode 响应状态码 responseHeaders 响应头信息 res…

Peter算法小课堂—动态规划斜率优化

大家来到这一堂课&#xff0c;就说明大家已经学过函数了 直线方程&#xff1a;ykxb 大家可以算一算。 其实&#xff0c;在数学上&#xff0c;这玩意要分类讨论 那么&#xff0c;这唯一的交点就是我们要背出来的 直线最值 这像一个分段函数 其实&#xff0c;只有部分直线能提供…

docker-compose yaml指定具体容器网桥ip网段subnet

docker-compose 启动yaml有时可能的容器网段与宿主机的ip冲突导致宿主机上不了网&#xff0c;这时候可以更改yaml指定subnet 宿主机内网一般是192**&#xff0c;这时候容器可以指定172* version: 3.9 services:coredns:image: coredns/coredns:1.10.0container_name: coredns…

详解Qt添加外部库

在Qt项目中添加外部库是一项常见任务&#xff0c;无论是静态库还是动态库都需要正确的配置才能让项目顺利编译链接。以下是详细步骤和不同场景下的配置方法&#xff1a; 方法一&#xff1a;手动编辑.pro文件 添加头文件路径&#xff1a; 在Qt项目中的.pro文件中使用INCLUDEPAT…

IO_DAY7

1:实现2个终端之间的互相聊天 要求:千万不要做出来2个终端之间的消息发送是读一写的&#xff0c;一定要能够做到&#xff0c;一个终端发送n条消息&#xff0c;另一个终端一条消息都不回复都是没有问题的 终端A&#xff1a; #include<myhead.h> int main(int argc, char…