- 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;
};



















