寻找两个链表的交点

该博客讨论了如何寻找两个链表的交点。在不破坏链表结构且无环的情况下,提出了两种方案:一是利用set求交集,但时间复杂度为O(nlogn),二是通过计算链表长度并同步移动指针,达到O(n)的时间复杂度和O(1)的空间复杂度。

 

一.题目描述

已知链表A的头节点指针headA, 链表B的头节点指针headB,两链表相交,求两链表交点对应的节点。

二.题目要求

1.如果两个链表没有交点,则返回NULL

2.在求交点的过程中,不可以破坏链表的结构或者修改链表的数据域

3.可以确保传入的链表A和链表B没有任何环

4.实现算法尽可能使时间复杂度为O(n), 空间复杂度为O(1)

三.  方案一:使用set求交集

1.遍历链表A,将A中节点对应的指针(地址),插入set

2.遍历链表B,将B中节点对应的指针(地址),在set中查找,发现在set中的第一个节点,即是两个链表的交点。

四.方案一的实现代码

#include<set>
#include<iostream>

using namespace std;


struct ListNode
{
       int val;
	   ListNode * next;
	   ListNode(int x):val(x),next(NULL)
	   {
	   	
	   }
};
class Solution
{
       
	   public:
	   ListNo
### 找到两个链表的第一个公共节点 为了找到两个链表的第一个公共节点,可以采用多种不同的策略。以下是几种常见且有效的解决方案。 #### 方法一:使用哈希表 通过遍历第一个链表并将每个节点的地址存入哈希表中,再遍历第二个链表并检查其节点是否存在于哈希表内来确定是否存在公共节点[^1]。此方法的时间复杂度为 \(O(n+m)\),空间复杂度同样为 \(O(n)\) 或者 \(O(m)\),取决于哪个链表更短一些被用来构建哈希集合。 ```c #include <stdio.h> #include <stdlib.h> typedef struct ListNode { int val; struct ListNode *next; } Node; // 哈希表辅助函数定义省略... Node* findFirstCommonNode(Node *headA, Node *headB){ if (!headA || !headB) return NULL; // 创建一个哈希表用于存储访问过的节点 HashTable ht = createHashTable(); while (headA != NULL){ insert(ht, headA); headA = headA->next; } while (headB != NULL && !contains(ht, headB)){ headB = headB->next; } destroyHashTable(&ht); return headB ? headB : NULL; } ``` #### 方法二:双指针法 考虑到当两个链表存在交叉部分时,从各自头部开始移动至尾部之后继续沿另一条路径前进最终会相遇于首个共同点或者null位置结束。具体做法如下: - 初始化两个指针 `pA` 和 `pB` 分别指向两条链表头; - 同步向前推进这两个指针直至遇到相同节点即为所交点;如果一方先抵达终点则转向对方起点重新出发; - 当两者都完成一轮完整的行程后要么已经碰面要么同时为空表示无交集情况发生。 这种方法不需要额外的空间开销,并且能够在线性时间内解决问题,时间复杂度为 \(O(n + m)\)[^5]。 ```c Node* getIntersectionNode(Node *headA, Node *headB) { if(!headA || !headB) return NULL; Node *pA = headA, *pB = headB; while(pA != pB){ pA = pA?pA->next:headB; pB = pB?pB->next:headA; } return pA; } ``` 这两种方式都可以有效地帮助定位两个单向链表之间的首次交汇处。选择哪种方案主要取决于实际应用场景下的性能需以及可用资源状况等因素考虑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值