目录
solution1 哈希表
时间复杂度O(N);空间复杂度O(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) {
unordered_set<ListNode*> seen;
ListNode* curA = headA;
ListNode* curB = headB;
while(curA != nullptr) {
seen.insert(curA);
curA = curA->next;
}
while(curB != nullptr) {
if(seen.count(curB)) return curB;//这里不用再insert了,判断即可
curB = curB->next;
}
return nullptr;
}
};
solution2 双指针,空间复杂度O(1)
时间复杂度O(N);空间复杂度O(1):额外提供了存储两个指针的空间。
总会“相交”的(最后都指向nullptr怎么不算“相交”呢?)
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if(headA == nullptr || headB == nullptr) {
return nullptr;
}
ListNode* pA = headA;
ListNode* pB = headB;
while(pA != pB) {
if(pA == nullptr) {
pA = headB;
} else {
pA = pA->next;
}
if(pB == nullptr) {
pB = headA;
} else {
pB = pB->next;
}
}
return pA;
}
};