题目描述
方法一:
思路描述:最简单的方法是遍历两个链表,存储每个节点,然后发现是否有相同的节点,如果有则返回该节点。
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
unordered_map<ListNode*, int> nodes;
ListNode* h1 = headA, *h2 = headB;
while(h1){
nodes[h1] = 1;
h1 = h1->next;
}
while(h2){
if(nodes[h2]) return h2;
h2 = h2->next;
}
return NULL;
}
};
方法二:
是不是一定存在 A 的长度加上相交前 B 的长度 = B 的长度加上相交前 A 的长度,所以我们可以用两个指针分别指向 A 和 B,当到达末尾时指向另一个链表的开头,相遇的时候一定是交点,如果不相遇那么说明这两个链表不相交。
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode* h1 = headA, *h2 = headB;
while (h1 != h2) {
if(h1) h1 = h1->next;
else h1 = headB;
if(h2) h2 = h2->next;
else h2 = headA;
}
return h1;
}
};