当前位置:网站首页>LeetCode每日一练 —— 160. 相交链表
LeetCode每日一练 —— 160. 相交链表
2022-07-28 15:33:00 【飞向星的客机】
前言
Wassup guys!我是Edison
今天是 LeetCode 上的 leetcode 160. 相交链表
Let’s get it!

1. 题目分析
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。
图示两个链表在节点 c1 开始相交:
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
示例 1:
示例 2:
示例 3:
2. 思路分析
这道题拆分的话,其实就是两步:
(1)判断两个链表是否相交
(2)然后找出第一个交点
判断相交
首先要判断链表 A 和 链表 B 是否相交,那怎么判断呢?
1. 思路一
就是用 链表 A 的每一个节点去和 链表 B 依次比较判断,如果有相等,就是相交,第一个相等就是相交;反之,不相交
但是这种方法需要那 A 里面的每一个节点去和 B 里面的 N 个节点进行比较,如果 A 有 M 个节点,那么时间复杂度就是 O ( M ∗ N ) O(M*N) O(M∗N)。
注意:这里比较的不是节点里面的 值,比较的是 当前节点存放的下一个节点的地址。
2. 思路二
A链表 找到 尾节点,B链表 也找到 尾节点。
当 尾节点 的地址相同时,就是 相交。
这种方法的时间复杂度为: O ( M + N ) O(M+N) O(M+N)。
求出交点
既然能判断链表是否相交了,那么如何找到交点呢?
也很简单,直接说方法:
(1)求出 A链表 的长度 La,再求出 B链表 的长度 Lb;
(2)如果 A链表 比 B链表 长,那么 A链表 先走 La - Lb 步;
(2)当 A链表 走了 差距步 以后,再让 A链表 和 B链表 再一起走,第一个 地址 相等的就是交点。
注意:
如果 B链表 比 A链表 长,那么让 B链表 先走 Lb - La 步;
为什么要用 长的 减去 短的?因为这样得到的结果才是一个 正数 呀,这两个相减得到的值就是 差距步。
其实这道题有点和 链表中倒数第 k 个结点 相似。
实现步骤
既然判断相交要从 头节点 开始走到 尾节点,那么我们就重新定义两个指针 tailA 和 tailB 分别指向 链表A 和 链表B 的头节点,然后开始往后走;
tailA 先走,当 tailA 走到 尾节点 时,就停下来(动图演示)
然后 tailB 再走,当 tailB 走到 尾节点 时,就停下来(动图演示)
注意:这里是走到 尾节点,也就是说当 尾节点 的 next 指向 NULL 时,就停下来。
然后再把 tailA 和 tailB 进行比较,如果它们的 地址 相等,说明相交,就找交点;如果 地址 不相等,就返回 NULL;
既然 地址 相等,那我们就要找交点,但是得先求出 A链表 和 B链表 的长度;
定义两个整型 lenA 和 lenB,分别用来表示长度,初始值设为 1。
计算 lenA 的过程
计算 lenB 的过程

注意:
为什么把 lenA 和 lenB 的 初始值设为 1 呢?
因为要求链表长度,也就是走到 尾节点 就结束了;
也就说从第一个节点开始计算,当走到 尾节点 时,就结束,相当于 尾节点 没有计算,所以就少算了 1 个。
然后就是求出 差距步,让 长 的链表先走 差距步,然后再一起走;
此时 lenB 大于 lenA,求出 差距步 为 1;
所以我们重新定义两个指针,longtList 指向 B 的头节点,shortList 指向 A 的头节点,然后让 longList 先走 差距步,也就是先走 1步(动图演示)
此时再让 longList 和 shortList 一起走,走到相等的位置就停下来(动图演示)
注意:
上面的图中给的链表是 B 长,A 短,但是实际情况有可能是 A 长,B 短;也有可能是 A 和 B 一样长;
所以我们要把长度进行判断,假设默认先设为 A 长,B 短;
如果 lenA 大于 lenB,那么假设成立,就求 差距步;
如果 lenA 小于 lenB,那么说明假设不成立,重新定义即可。
3. 代码实现
接口代码
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
struct ListNode* tailA, *tailB;
tailA = headA;
tailB = headB;
int lenA = 1; // 存放A链表的长度
int lenB = 1; // 存放B链表的长度
// A链表找尾节点
while (tailA->next) {
tailA = tailA->next;
++lenA;
}
// B链表找尾节点
while (tailB->next) {
tailB = tailB->next;
++lenB;
}
// 如果不相等就返回NULL
if (tailA != tailB) {
return NULL;
}
// 相交,求交点,长的先走"差距步", 然后一起走
struct ListNode* shortList = headA; // 假设A短
struct ListNode* longList = headB; // 假设B长
// 如果A的长度大于B
if (lenA > lenB) {
// 那么就交换一下
longList = headA;
shortList = headB;
}
// 求出差距步
int gap = abs(lenA - lenB); // abs是求绝对值的函数
// 长的先走差距步
while (gap--) {
longList = longList->next;
}
// 然后同时走
while (shortList && longList) {
if (shortList == longList) {
return shortList;
}
shortList = shortList->next;
longList = longList->next;
}
// 要加这个,不然会显示[编译出错]
return NULL;
}
提交结果
边栏推荐
- Li Hongyi, machine learning 4. Deep learning
- laravel
- 2021-04-02
- 重置grafana登录密码为默认密码
- el-input限制只能输入规定的数
- Solve the width overflow of rich text pictures such as uniapp
- I came across Digital Phoenix coordinate Xuhui Meiluo city in Shanghai
- KubeEdge发布云原生边缘计算威胁模型及安全防护技术白皮书
- PHP gets the applet code, and the applet jumps with parameters
- ANSA二次开发 - Apps和ANSA插件管理
猜你喜欢

Leetcode topic

遭MQ连连干翻后的醒悟!含恨码出这份MQ手册助力秋招之旅

Ansa secondary development - build ansa secondary development environment on Visual Studio code

排序2-冒泡排序与快速排序(递归加非递归讲解)

一大早支付宝来短信说你中“奖”了?处理服务器挖矿病毒 - kthreaddi

Use js direct OSS to store files in Alibaba cloud and solve the limitation of large file upload server

关于标准IO缓冲区的问题

ANSA二次开发 - 抽中面的两种方法

I can only sell the company after the capital has been "cut off" for two years

MySQL view event status statements and modification methods
随机推荐
laravel
Numpy ndarray learning < I > Foundation
HM二次开发 - Data Names及其使用
QT打包
Early in the morning, pay Bora SMS to say that you won the "prize"? Dealing with server mining virus - kthreaddi
KubeEdge发布云原生边缘计算威胁模型及安全防护技术白皮书
HyperMesh运行脚本文件的几种方法
Qt学习第一天
每一个账号对应所有密码,再每一个密码对应所有账号暴力破解代码怎么写?...
"Wei Lai Cup" 2022 Niuke summer multi school training camp 3 a.ancestor lca+ violence count
Li Hongyi, machine learning 5. Tips for neural network design
PHP gets the applet code, and the applet jumps with parameters
Record doc
curl无输出返回空白或者null问题解决
PHP image synthesis technology
PHP 图片上传
Darknet training yolov4 record
疫情红利消失,「居家健身」泡沫消散
8051 series MCU firmware upgrade IAP
"Weilai Cup" 2022 Niuke summer multi school training camp 3 h.hacker sam+ segment tree /dp/ divide and conquer (without the largest sub segment and of the inspection interval)
