数据结构 ——— 相交链表(链表的共节点)

news2024/11/24 13:44:55

题目要求

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


手搓两个相交简易链表

代码演示:

struct ListNode* a1 = (struct ListNode*)malloc(sizeof(struct ListNode));
assert(a1);
struct ListNode* a2 = (struct ListNode*)malloc(sizeof(struct ListNode));
assert(a2);

a1->val = 1;
a2->val = 2;

a1->next = a2;

struct ListNode* b1 = (struct ListNode*)malloc(sizeof(struct ListNode));
assert(b1);
struct ListNode* b2 = (struct ListNode*)malloc(sizeof(struct ListNode));
assert(b2);
struct ListNode* b3 = (struct ListNode*)malloc(sizeof(struct ListNode));
assert(b3);

b1->val = 1;
b2->val = 2;
b3->val = 3;

b1->next = b2;
b2->next = b3;

struct ListNode* c1 = (struct ListNode*)malloc(sizeof(struct ListNode));
assert(c1);
struct ListNode* c2 = (struct ListNode*)malloc(sizeof(struct ListNode));
assert(c2);
struct ListNode* c3 = (struct ListNode*)malloc(sizeof(struct ListNode));
assert(c3);

c1->val = 1;
c2->val = 2;
c3->val = 3;

a2->next = c1;
b3->next = c1;
c1->next = c2;
c2->next = c3;
c3->next = NULL;

代码实现

代码演示:

struct ListNode* getIntersectionNode(struct ListNode* headA, struct ListNode* headB)
{
	// 先找各自链表的尾节点,判断是否相交
	struct ListNode* tailA = headA;
	struct ListNode* tailB = headB;

	int lenA = 1;
	int lenB = 1;

	while (tailA->next != NULL)
	{
		tailA = tailA->next;
		lenA++;
	}

	while (tailB->next != NULL)
	{
		tailB = tailB->next;
		lenB++;
	}

	if (tailA != tailB)
		return NULL;

	// 找相交节点
	int gap = abs(lenA - lenB);

	struct ListNode* longList = headA;
	struct ListNode* 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;
}

代码解析:

代码思路:先判断两个链表是否相交,那么就是看尾节点是否相同,不相同就说明不相交,返回NULL 即可,尾节点相同则表示相交,再将节点长的链表走差距步,然后再同时往后走,找到相同的节点时,就是相交的节点

代码逻辑:两个链表各自往后走,并记录各自节点的个数,先判断尾节点的地址是否相同(注意:不是判断两个节点的数据是否相同),不想同就返回 NULL ,相同就利用 abs 函数求出 lenA 减去 lenB 的绝对值,就是两个链表相差的节点个数,再求出长的链表,先走差距步,再一起往后走,走到地址相同的节点时,就时交点

代码验证:

算法的时间和空间复杂度:

3 个 while 循环执行了 N 次,也就是 3*N(除去 3) ,且没有产生额外的空间

时间复杂度: O(N)

空间复杂度:O(1)

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

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

相关文章

Git 分支提交同步到主干的详细教程——(包含命令行和idea操作两种方式)

文章目录 Git 分支提交同步到主干的详细教程一、Git 命令行操作1. 确保分支上的代码已提交2. 切换到主干分支3. 拉取最新的主干分支代码4. 合并分支到主干方式一&#xff1a;使用 merge 进行合并方式二&#xff1a;使用 rebase 进行合并 5. 推送合并后的代码到远程主干分支命令…

github 搭建个人导航网

最近搭建了个 个人的导航网&#xff0c;具体内容见下图&#xff0c;欢迎大家访问吖&#xff0c;点击访问 具体实现是使用 vue3 编写&#xff0c;白嫖 github 的 page 部署 首先在 github上创建一个仓库&#xff1a;name.github.io # name是你 github 的名字 然后在本地创建一…

Linux安装部署MySQL8.0加遇着问题解决

1.首先我先给个URL下载MySQL官方网站https://downloads.mysql.com/archives/community/ 2.选择Linux的红帽系统 3.接着选择红帽系统的7版本,x86 4.接着选择MySQL版本,此时我选择8.4.0,下载rpm bundle这个,下载下面这个就好 5.Windows文件上传到Linux系统 rz上传文件命令,找到…

【D3.js in Action 3 精译_030】3.5 给 D3 条形图加注图表标签(下):Krisztina Szűcs 人物专访 + 3.6 本章小结

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可…

【redis-05】redis保证和mysql数据一致性

redis系列整体栏目 内容链接地址【一】redis基本数据类型和使用场景https://zhenghuisheng.blog.csdn.net/article/details/142406325【二】redis的持久化机制和原理https://zhenghuisheng.blog.csdn.net/article/details/142441756【三】redis缓存穿透、缓存击穿、缓存雪崩htt…

Qt+大恒相机回调图片刷新使用方式

一、前言 上篇文章介绍了如何调用大恒SDK获得回调图片&#xff0c;这篇介绍如何使用这些图片并刷新到界面上。考虑到相机的帧率很高&#xff0c;比如200fps是很高的回调频率。那么我们的刷新频率是做不到这么快&#xff0c;也没必要这么快。一般刷新在60帧左右就够了。 二、思路…

springboot kafka多数据源,通过配置动态加载发送者和消费者

前言 最近做项目&#xff0c;需要支持kafka多数据源&#xff0c;实际上我们也可以通过代码固定写死多套kafka集群逻辑&#xff0c;但是如果需要不修改代码扩展呢&#xff0c;因为kafka本身不处理额外逻辑&#xff0c;只是起到削峰&#xff0c;和数据的传递&#xff0c;那么就需…

Unity_Obfuscator Pro代码混淆工具_学习日志

Unity_Obfuscator Pro代码混淆工具_学习日志 切勿将密码或 API 密钥存储在您附带的应用程序内。 混淆后的热更新暂时没有想到怎么办 Obfuscator 文档 https://docs.guardingpearsoftware.com/manual/Obfuscator/Description.html商店链接Obfuscator Pro&#xff08;大约$70&a…

169.254.0.0/16是什么地址?

169.254.0.0/16是一个链路本地地址&#xff0c;也称为连结本地位址&#xff0c;主要用于局域网内的主机相互通信。‌ 这种地址仅供在网段或广播域中的主机相互通信使用&#xff0c;不需要外部互联网服务‌。 169.254.0.0/16地址段定义在RFC 3927中&#xff0c;当DHCP服务器无法…

永洪BI:企业数字化转型的得力助手

在当今快速变化的商业环境中&#xff0c;数据已成为企业决策的重要依据。随着大数据、云计算和人工智能技术的发展&#xff0c;企业对数据分析的需求日益增长。永洪BI&#xff08;Business Intelligence&#xff09;作为国内领先的商业智能解决方案提供商&#xff0c;以其强大的…

在mac中通过ip连接打印机并实现双面打印

首先需要找到电脑自带的打印。添加打印机。 填写好打印机的ip地址&#xff0c;然后添加。 填写好ip地址后&#xff0c;直接添加就行 添加完打印机后其实就可以打印了。但是有些功能可能实现不了&#xff0c;比如说双面打印。为了实现双面打印的功能&#xff0c;需要再进行设置…

从0到1:企事业单位知识竞赛答题小程序迭代开发笔记一

背景调研 企事业单位知识竞赛答题小程序&#xff0c;在信息技术迅猛发展的时代&#xff0c;企业和事业单位在提升员工素质和知识水平方面面临着新的挑战。为了增强员工的学习积极性、提高团队凝聚力和整体素质&#xff0c;越来越多的单位开始组织知识竞赛活动。传统的知识竞赛…

SQL第13课——创建高级联结

本课讲另外一些联结&#xff08;含义和使用方法&#xff09;&#xff0c;如何使用表别名&#xff0c;如何对被联结的表使用聚集函数。 13.1 使用表别名 第7课中使用别名引用被检索的表列&#xff0c;给列起别名的语法如下&#xff1a; SQL除了可以对列名和计算字段使用别名&a…

kafka和zookeeper单机部署

安装kafka需要jdk和zookeeper环境&#xff0c;因此先部署单机zk的测试环境。 zookeeper离线安装 下载地址&#xff1a; zookeeper下载地址&#xff1a;Index of /dist/zookeeper 这里下载安装 zookeeper-3.4.6.tar.gz 版本&#xff0c;测试环境单机部署 上传服务器后解压缩 …

代码随想录 | Day29 | 回溯算法:电话号码的字母组合组合总和

代码随想录 | Day29 | 回溯算法&#xff1a;电话号码的字母组合&&组合总和 关于这个章节&#xff0c;大家最好是对递归函数的理解要比较到位&#xff0c;听着b站视频课可能呢才舒服点&#xff0c;可以先去搜一搜关于递归函数的讲解&#xff0c;理解&#xff0c;再开始…

Linux -- 命令(一)

目录 知识点登入Xshellwhoamipwdlscdtouchstattreewhichll和ls和ls -lnanorm*关联符mancp 知识点 windows&#xff1a;\路径分隔符 Linux: /路径分割符目录 文件夹 如果建立一个空文件&#xff0c;修改文件也要占据磁盘空间文件 内容 属性 学习文件&#xff1a;要么对内容操…

宝塔面板专业版有什么区别?支持更多专业版插件

宝塔面板专业版和免费版有什么区别&#xff1f;宝塔面板专业版相比免费版支持更多专业版插件&#xff0c;包括&#xff1a;防火墙、网站监控、宝塔任务管理、对象存储、宝塔系统加固等专业版插件&#xff0c;详细参考 bt.cn/u/DjHjth 宝塔面板专业版和免费版区别 宝塔linux面板…

快速部署vue项目

简介 在现代前端开发中&#xff0c;工具的选择对于提高开发效率至关重要。Vite 是一个新型的前端构建工具&#xff0c;它利用了 ES 模块的特性来提供快速的开发体验。而 pnpm 则是一个高效的包管理器&#xff0c;能够极大地节省磁盘空间并加速依赖安装过程。本文将介绍如何使用…

Python | 由高程计算坡度和坡向

写在前面 之前参加一个比赛&#xff0c;提供了中国的高程数据&#xff0c;可以基于该数据进一步计算坡度和坡向进行相关分析。 对于坡度和坡向&#xff0c;这里分享一个找到的库&#xff0c;可以方便快捷的计算。这个库为&#xff1a;RichDEM&#xff0c;官网地址如下 https…

基于SpringBoot的音乐网站系统

本地测试环境&#xff1a;eclipse或idea&#xff0c;数据库MySQL5.7&#xff0c; jdk1.8 使用技术&#xff1a;SpringBootMyBatis 主要功能&#xff1a;分类管理、音乐管理、系统管理等