数据结构 ——— 单链表oj题:相交链表(链表的共节点)

news2024/11/26 16:58:52

目录

题目要求

手搓两个相交简易链表

代码实现 


题目要求

两个单链表的头节点 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/2204860.html

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

相关文章

SpringSecurity(一)——认证实现

一、初步理解 SpringSecurity的原理其实就是一个过滤器链&#xff0c;内部包含了提供各种功能的过滤器。 当前系统中SpringSecurity过滤器链中有哪些过滤器及它们的顺序。 核心过滤器&#xff1a; &#xff08;认证&#xff09;UsernamePasswordAuthenticationFilter:负责处理…

LabVIEW提高开发效率技巧----状态保存与恢复

在LabVIEW开发中&#xff0c;保存和恢复程序运行时的状态是一个关键技巧&#xff0c;特别是在涉及需要暂停或恢复操作的应用中。通过使用 Flatten To String 和 Unflatten From String 函数&#xff0c;开发人员可以将程序当前的状态转换为字符串并保存&#xff0c;再在需要时恢…

Vue入门-指令修饰符-事件修饰符

事件修饰符 事件名.stop ->阻止冒泡 demo&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><ti…

【Redis】Set类型常用命令

目录 一. Set集合类型简介.二. 增加元素相关命令2.1 向集合中添加元素(sadd)2.2 从集合中移动元素( smove ) 三. 查询元素相关操作.3.1 查询集合中存在的所有元素.( smembers )3.2 查询集合中是否存在member( sismember ) 四. 随机获取集合中的元素4.1 随机获取集合中的n个元素…

LabVIEW中的非阻塞定时器

在LabVIEW编程中&#xff0c;通常需要在某些任务执行过程中进行非阻塞的延时操作。例如&#xff0c;显示某条信息一段时间&#xff0c;同时继续执行其他任务&#xff0c;并在延时时间结束后停止显示该信息。这类需求通常用于处理优先级不同的信息显示&#xff0c;如错误信息需要…

2024双十一买啥最划算?四款必入的数码好物推荐!

随着2024年双十一购物狂欢节的临近&#xff0c;各大电商平台纷纷推出了一系列令人期待的优惠活动&#xff0c;这无疑是一年中最佳的采购时机。对于追求科技潮流与实用主义的消费者而言&#xff0c;选择在这个时候入手心仪已久的数码产品无疑是明智之举。为了帮助大家抓住这波促…

Windows系统操作技巧

文章目录 I 打开‌任务管理器II Windows的run功能常用命令RDP协议的远程连接I 打开‌任务管理器 ‌通过快捷键打开‌任务管理器 ‌[Ctrl + Shift + Esc]:这是最常用的方法,直接按下这三个键即可快速打开任务管理器。‌Ctrl + Alt + Delete‌:按下这三个键后会弹出一个菜单,…

PostgreSQL数据库定期清理归档(pg_wal)日志

一、配置归档模式 在postgresql.conf文件中设置archive_mode on来启用归档功能。 二、设置归档命令 同样在postgresql.conf中&#xff0c;设置archive_command参数&#xff0c;指定一个shell命令来处理归档日志&#xff0c;例如&#xff1a; archive_command cp %p /home/…

中英文在线翻译工具大盘点

中英文在线翻译工具如同语言世界的桥梁&#xff0c;连接着两种不同的文化和语言体系。接下来&#xff0c;让我们一同走进这个精彩纷呈的中英文在线翻译工具集锦&#xff0c;探寻它们的奥秘与魅力。 1.福昕在线翻译 链接直达>>https://fanyi.pdf365.cn/doc 这款在线翻…

Git的基本使用入门

参考&#xff1a;Git速查 git的基本概念 git常用命令大部分是基于三大分区来执行的。先来了解一些专有名词吧。 工作区&#xff0c;也叫 Working Directory暂存区&#xff0c;也叫 stage&#xff0c;index版本库&#xff0c;也叫本地仓库&#xff0c;commit History 将代码推…

书店系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;图书管理&#xff0c;论坛信息管理&#xff0c;用户管理&#xff0c;公告信息管理&#xff0c;基础数据管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;论坛信息&…

(六)、CT中的滤光片

在X射线中衰减是吸收和散射的结果。X射线可以由于光电效应而衰减&#xff0c;也可以由于康普顿效应而衰减和散射。长波长X射线对CT图像形成的贡献不显著&#xff0c;但会增加患者的剂量&#xff0c;总体的来讲就是要保留穿透能力强的X光。 光电效应是指当光子与物质中的原子相互…

springboot宠物托管平台-计算机毕业设计源码82186

摘要 随着人们生活水平的提高&#xff0c;宠物已经成为越来越多家庭的重要成员。然而&#xff0c;由于工作、旅行等原因&#xff0c;宠物主人在某些时候可能无法亲自照顾宠物&#xff0c;因此宠物托管服务应运而生。本文旨在设计并实现一个基于Spring Boot框架的宠物托管平台&a…

YOLOv8模型改进 第六讲 添加多尺度卷积注意力模块(MSCAM)

在计算机视觉领域&#xff0c;目标检测的准确性和效率是研究的热点之一。YOLOv8 作为最新一代的实时目标检测模型&#xff0c;已经在多个基准数据集上展示了其优越的性能。然而&#xff0c;随着数据集和应用场景的复杂性增加&#xff0c;如何进一步提升模型的检测精度和鲁棒性仍…

Kafka之基本概念

1、Kafka是什么&#xff1f; Kafka是由Scala语言开发的一个多分区、多副本&#xff0c;基于Zookeeper集群协调的系统。 那这个所谓的系统又是什么系统呢&#xff1f; 回答这个问题要从发展的角度来看&#xff1a;起初Kafka的定位是分布式消息系统。但是目前它的定位是一个分布…

用户代理样式表:你真的了解它吗?

引言 作为一名前端开发者&#xff0c;你是否曾经遇到过这样的情况&#xff1a;明明CSS代码写得一模一样&#xff0c;但是在不同的浏览器上呈现出的效果却大相径庭&#xff1f;这背后的原因&#xff0c;很大程度上要归结于所谓的“用户代理样式表”。 用户代理样式表&#xff…

TY1801 内置GaN电源芯片(18w-65w)

TY1801 是一款针对离线式反激变换器的多模式 PWM GaN 功率开关。TY1801内置 GaN 功率管,具备超宽 的 VCC 工作范围&#xff0c;非常适用于 PD 快充等要求宽输出电压的应用场合,TY1801不需要使用额外的绕组或外围降压电路&#xff0c;节省系统 BOM 成本。TY1801 支持 Burst&…

iPhone16销量不佳?海外机构给出否定答案,让国产手机失望了

在国内媒体都喜欢宣传iPhone16销量不佳&#xff0c;苹果又慌了等诸多对苹果不利的消息&#xff0c;不过日前海外分析机构却给出了不一样的答案&#xff0c;认为iPhone16的销量超过了去年的iPhone15&#xff0c;显然与国内媒体的宣传很不一样。 海外分析机构的数据是整理了iPhon…

【拥抱AIGC】应该如何衡量AI辅助编程带来的收益

本文主要介绍了如何度量研发效能&#xff0c;以及AI辅助编程是如何影响效能的&#xff0c;进而阐述如何衡量AI辅助编程带来的收益。 理解度量&#xff1a;有效区分度量指标 为了帮助研发团队更好地理解和度量研发效能&#xff0c;可以将指标分为三类&#xff1a;能力和行为指…

Python异常处理详解:try, except, else, finally的使用方法与示例

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…