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

OJ12:160. 相交链表

目录

  • 题目
  • 思路分析
  • 代码展示


题目

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

示例 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
输出:No intersection
解释:从各自的表头开始算起,链表 A 为 [2,6,4],链表 B 为 [1,5]。
由于这两个链表不相交,所以 intersectVal 必须为 0,而 skipA 和 skipB 可以是任意值。
这两个链表不相交,因此返回 null 。

思路分析

我们想要找到是否相交,就要找出指向相等的地址的节点·,这样就可以找到其相交的节点;
在这里插入图片描述

  1. 由于我们不知道两个链表的长度如何,所以我们要对较长的那个链表 “先走差距步”保证两个链表长度相等了之后,再移动。
    这样我们就要先算出两个链表的长度进行比较:
//计算两个链表的长度
int la = 0;
int lb = 0;
ListNode* curA = headA;
ListNode* curB = headB;while (curA)
{la++;curA->next;
}
while (curB)
{lb++;curB->next;
}
  1. 确定长链表,但是我们无法确定那个是长链表,所以我们假设A链表是长链表,如果不是,我们再作交换:
//假设headA指向的链表长
ListNode* longNode = headA;
ListNode* shortNode = headB;
if (la < lb)  //假设不成立
{longNode = headB;shortNode = headA;
}
  1. 移动长链表的指针,使指针后的两个链表的节点个数一致
int gap = abs(la - lb);
while (gap--)
{longNode = longNode->next;
}

在这里插入图片描述4. 共同向后移动,直到找到指向相同的节点

while (longNode)
{if (longNode == shortNode)return longNode;longNode = longNode->next;shortNode = shortNode->next;
}
return NULL;

在这里插入图片描述
在这里插入图片描述

代码展示

struct ListNode {int val;struct ListNode* next;
};
typedef struct ListNode ListNode;
struct ListNode* getIntersectionNode(struct ListNode* headA, struct ListNode* headB) {if (headA == NULL || headB == NULL)return NULL;//计算两个链表的长度int la = 0;int lb = 0;ListNode* curA = headA;ListNode* curB = headB;while (curA){la++;curA->next;}while (curB){lb++;curB->next;}//假设headA指向的链表长ListNode* longNode = headA;ListNode* shortNode = headB;if (la < lb)  //假设不成立{longNode = headB;shortNode = headA;}int gap = abs(la - lb);while (gap--){longNode = longNode->next;}while (longNode){if (longNode == shortNode)return longNode;longNode = longNode->next;shortNode = shortNode->next;}return NULL;
}

http://www.lryc.cn/news/520889.html

相关文章:

  • 软件工程和项目管理领域 - CMMI 极简理解
  • C# 线程基础之 线程同步
  • [c语言日寄]c语言也有“回”字的多种写法——整数交换的三种方式
  • RocketMQ 知识速览
  • 优化 Azure Synapse Dedicated SQL Pool中的 SQL 执行性能的经验方法
  • 详解英语单词“pro bono”:公益服务的表达(中英双语)
  • 16. C语言 字符串详解
  • 使用Buildroot开始嵌入式Linux系统之旅-3
  • [免费]SpringBoot+Vue新能源汽车充电桩管理系统【论文+源码+SQL脚本】
  • 【已解决】【记录】2AI大模型web UI使用tips 本地
  • 44.ComboBox的数据绑定 C#例子 WPF例子
  • 物联网之传感器技术
  • QTreeWidget QTreeWidgetItem
  • torch.einsum计算张量的外积
  • PostgreSQL 超级管理员详解
  • RabbitMQ 工作模式使用案例之(发布订阅模式、路由模式、通配符模式)
  • 【2024年华为OD机试】(C卷,100分)- 机场航班调度程序 (Java JS PythonC/C++)
  • Vue.js组件开发-使用地图绘制轨迹
  • vue 与 vue-json-viewer 实现 JSON 数据可视化
  • ubuntu Android : adb logcat 过滤多个log
  • kubeneters-循序渐进Cilium网络(三)
  • 编译与汇编
  • 对MySQL滴MVCC理解(超详细)
  • Mac玩Steam游戏秘籍!
  • matlab实现了一个优化的遗传算法,用于求解注汽站最优位置的问题
  • 电商项目-基于ElasticSearch实现商品搜索功能(三)
  • 【Vim Masterclass 笔记12】S06L26 + L27:Vim 文本的搜索、查找及替换同步练习(含点评课)
  • Jsoup实现实时爬取
  • 如何在Ubuntu上安装Cmake
  • 图解Git——分支开发工作流《Pro Git》