一、介绍
1.题目描述
题目链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists/
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
图示两个链表在节点 c1 开始相交
注意事项:
- 这里的相同是指节点相同,而不是节点的值相同
- 当出现节点相同,后续节点必相同
2.测试样例
8
[4,1,8,4,5]
[5,6,1,8,4,5]
2
3
# Intersected at '8'
0
[2,6,4]
[1,5]
3
2
# No intersection
二、题解
1、双指针🟢
1、计算两个链表的长度
2、两个链表长度相差 x 个节点,将长链表先移动 x 个节点后再进行比较
- 比较 p==q,而不是 p->val==q->val
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
// 分别计算两个链表长度
int n1=0,n2=0;
ListNode *p1=headA,*p2=headB;
while(p1!=nullptr){
n1++;
p1=p1->next;
}
while(p2!=nullptr){
n2++;
p2=p2->next;
}
// 先让长链表移动 k 个节点,再开始比较
p1=headA;p2=headB;
if(n1>n2) for(int i=0;i<n1-n2;i++) p1=p1->next;
else for(int i=0;i<n2-n1;i++) p2=p2->next;
// ans记录相交节点,无相交则为空
ListNode* ans=nullptr;
while(p1!=nullptr){
if(p1==p2){
ans=p1;
break;
}
p1=p1->next;
p2=p2->next;
}
return ans;
}
};
2、哈希🟡
1、将第一个链表存入 set
2、遍历第二个链表,看节点是否在 set 中
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
// 将第一个链表存入 set
set<ListNode*> set;
ListNode *p=headA,*q=headB;
while(p!=nullptr){
set.insert(p);
p=p->next;
}
// 遍历第二个链表,看节点是否在 set 中
while(q!=nullptr){
if(set.count(q)) return q;
q=q->next;
}
return nullptr;
}
};