本题解决方法也有两种:哈希表、双指针。
哈希表:记录从一个 head 开始经过的节点存入表中;遍历另一个 head,遇到重复节点返回。
双指针:虽然路径a、b
的长度可能不同,但其路径之和一定相等 a+b = b+a
。针对这一点,记录两个指针,分别从两个路径头开始移动,速度均为1,若走到链表尽头 nullptr
则再从另一个路径头开始移动,若两个指针相遇,即返回。
由于路径之和相等,若两链表相交,则指针会在相交点相遇;若两链表不相交,指针最后则会同时指向空指针。
附上代码:
哈希表
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode* out = nullptr;
map<ListNode*, int> m;
while(headA!=nullptr){
m[headA] = 1;
headA = headA->next;
}
while(headB != nullptr){
if(m.count(headB)) {
out = headB;
break;
}
headB = headB->next;
}
return out;
}
};
双指针
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode* a = headA;
ListNode* b = headB;
while(a != b){
a = a == nullptr ? headB : a->next;
b = b == nullptr ? headA : b->next;
}
return a;
}
};