解答:
cpp
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
//方法一:先遍历一条链表,存节点;再遍历另一条链表,找对应的节点有没有存过
// unordered_set<ListNode*>vis;
// ListNode *temp=headA;
// while(temp!=nullptr){
// vis.insert(temp);
// temp=temp->next;
// }
// temp=headB;
// while(temp!=nullptr){
// if(vis.count(temp)!=0){
// return temp;
// }
// temp=temp->next;
// }
// return nullptr;
//方法二:双指针
if(headA==nullptr || headB==nullptr){
return nullptr;
}
ListNode *pA=headA,*pB=headB;
while(pA!=pB){
pA=pA==nullptr?headB:pA->next;
pB=pB==nullptr?headA:pB->next;
}
return pB;
}
};
方法一:
时间复杂度O(M+N)
空间复杂度O(N)
方法二:
时间复杂度O(M+N)
空间复杂度O(1)
方法二思想详见官方题解link
直白理解:两个链表左端对齐,后面的分别用对方的给补上,如果两个一样长,那就不用找到后面补上的部分;如果不一样长,分别经过对方的补上之后相同的部分就能拉齐了