每日一题(相交链表 )

欢迎大家来我们主页进行指导
LaNzikinh-CSDN博客


160. 相交链表 - 力扣(LeetCode)

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

图示两个链表在节点 c1 开始相交**:**

题目数据 保证 整个链式结构中不存在环。

注意 ,函数返回结果后,链表必须 保持其原始结构

自定义评测:

评测系统 的输入如下(你设计的程序 不适用 此输入):

  • intersectVal - 相交的起始节点的值。如果不存在相交节点,这一值为 0
  • listA - 第一个链表
  • listB - 第二个链表
  • skipA - 在 listA 中(从头节点开始)跳到交叉节点的节点数
  • skipB - 在 listB 中(从头节点开始)跳到交叉节点的节点数

评测系统将根据这些输入创建链式数据结构,并将两个头节点 headAheadB 传递给你的程序。如果程序能够正确返回相交节点,那么你的解决方案将被 视作正确答案

首先做这个题目有两个核心的关键就是,1.你要判断它是不是相交的。2.它的交点


思路一:暴力求解

依次去A链表中的每个节点跟B链表中的所有节点比较,如果有地址相同的节点,就是相交,第一个相同的就是交点

时间复杂度为O(N^2),非常麻烦,这里就不多说了,我们直接来说思路二


思路二:长度差法

核心:尾结点相同,就是相交否则就不相交,长的链表先走长度差步,再同时走,第一个相同的就是交点

2.1计算长度

先保存两个头结点用来比较长度,因为我遍历完了两个链表,所以把是不是相交一起判断了

cpp 复制代码
//先保存两个头结点用来比较长度
struct ListNode* tailA = headA;
struct ListNode* tailB = headB;
//计算A的长度
int lenA = 1;
while (tailA->next != NULL)
{
	lenA++;
	tailA = tailA->next;
}
//计算B的长度
int lenB = 1;
while (tailB->next != NULL)
{
	lenB++;
	tailB = tailB->next;
}
//是不是相交一起判断
if (tailA != tailB)
{
	return NULL;
}

2.2判断那个长?

这个用了一个非常巧妙的办法来写出了如何判断这两个长,因为我不知道这两个最开始到底是谁长

cpp 复制代码
//abs取绝对值
int gap = abs(lenA - lenB);
//先假设A长
struct ListNode* long = headA;
struct ListNode* short = headB;
//在做出判断,如果A短就互换
if (lenA < lenB)
{
	struct ListNode* long = headB;
	struct ListNode* short = headA;
}

2.3长的先走,短的在一起走

cpp 复制代码
//长的先走gap步
while (gap--)
{
	long = long->next;
}
//等长的走完,在一起走,之后返回向遇点就可以了
while (long != short)
{
	long = long->next;
	short = short->next;
}
//返回short也可以
return long;

2.4总代码

cpp 复制代码
struct ListNode* getIntersectionNode(struct ListNode* headA, struct ListNode* headB)
{
	//先保存两个头结点用来比较长度
	struct ListNode* tailA = headA;
	struct ListNode* tailB = headB;
	//计算A的长度
	int lenA = 1;
	while (tailA->next != NULL)
	{
		lenA++;
		tailA = tailA->next;
	}
	//计算B的长度
	int lenB = 1;
	while (tailB->next != NULL)
	{
		lenB++;
		tailB = tailB->next;
	}
	if (tailA != tailB)
	{
		return NULL;
	}
	//abs取绝对值
	int gap = abs(lenA - lenB);
	//先假设A长
	struct ListNode* long = headA;
	struct ListNode* short = headB;
	//在做出判断,如果A短就互换
	if (lenA < lenB)
	{
		struct ListNode* long = headB;
		struct ListNode* short = headA;
	}
	//长的先走gap步
	while (gap--)
	{
		long = long->next;
	}
	//等长的走完,在一起走,之后返回向遇点就可以了
	while (long != short)
	{
		long = long->next;
		short = short->next;
	}
	//返回short也可以
	return long;
}
相关推荐
CSharp精选营3 天前
关系型 vs 非关系型:从原理到选型,一文搞定数据库核心分类
数据结构·nosql·关系型数据库·非关系型数据库·技术选型
刘马想放假6 天前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
北域码匠7 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
Darling噜啦啦14 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
小小工匠15 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
玖玥拾15 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
Qres82115 天前
算法复键——树状数组
数据结构·算法
牛油果子哥q15 天前
并查集(DSU)超精讲,路径压缩、按秩合并、万能模板、连通性判定、最小生成树与刷题实战全解
数据结构·c++·最小生成树·并查集
凌波粒15 天前
LeetCode--491.递增子序列(回溯算法)
数据结构·算法·leetcode
疯狂成瘾者15 天前
Java 集合 LinkedList 详解:链表结构、常用方法和队列使用
java·开发语言·链表