- https://leetcode.cn/problems/intersection-of-two-linked-lists/solution/
- 相交链表是指两个单向链表在某个节点处相交,之后形成了共同的后续部分。通常,两个链表的长度不相等。在相交节点之前,两个链表的节点数可能不同,但在相交节点之后,两个链表的节点数必须相等。找到两个相交链表的交点是一个经典的问题,可以使用双指针或哈希表等方法解决。
双指针法
- 双指针法是解决相交链表问题的常用方法,步骤如下:
-
分别遍历两个链表,获取它们的长度。
-
让较长的链表先走多出来的步数,使得两个链表的起始点到相交点的距离相等。
-
同时遍历两个链表,直到找到第一个相同的节点,即为相交点。
-
如果没有找到相交点,则说明两个链表不相交。
双指针法的时间复杂度为 O(m+n),其中 m 和 n 分别为两个链表的长度。在空间复杂度上,只需要常数级别的额外空间,因此是一种较为高效的解决方法。
哈希表法
- 哈希表也是解决相交链表问题的常用方法,步骤如下:
-
遍历第一个链表,将每个节点的地址存入哈希表中。
-
遍历第二个链表,每次遍历到一个节点时,在哈希表中查找是否存在相同的节点地址。
-
如果存在相同的节点地址,则说明两个链表相交,返回该节点地址即可。
-
如果遍历完第二个链表仍未找到相交点,则说明两个链表不相交。
哈希表法的时间复杂度为 O(m+n),其中 m 和 n 分别为两个链表的长度。在空间复杂度上,需要额外的哈希表空间,因此空间复杂度较高。但是,哈希表法适用于链表中存在重复节点的情况,而双指针法则不适用。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if( (!headA) || (!headB)){
return NULL;
}
while(headA){
myset.insert(headA);
headA = headA->next;
}
while(headB){
auto res = myset.find(headB);
if(res!=myset.end()){
return headB;
}
headB = headB->next;
}
return NULL;
}
private:
set<ListNode*> myset;
};