剑指 Offer 52. 两个链表的第一个公共节点
题目链接:剑指 Offer 52. 两个链表的第一个公共节点
方法一:两次遍历
解题思路
将两个单链表的遍历指针先置于同一起跑线(相对于相交的点),然后会同时遍历到相交的节点。
注意:模拟下方代码即可理解,第一次遍历长度为长的链表长度,第二次遍历长度为短的链表长度。
代码
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if (!headA || !headB) return NULL;
ListNode* tmpA = headA;
ListNode* tmpB = headB;
while (tmpA != tmpB) {
if (!tmpA) tmpA = headB;
else tmpA = tmpA->next;
if (!tmpB) tmpB = headA;
else tmpB = tmpB->next;
}
return tmpA;
}
};
复杂度分析
时间复杂度:\(O(n),n = n1 + n2\);
空间复杂度:\(O(1)\)。
方法二:哈希表
解题思路
分别遍历两个链表,将节点指针存储在数组中,然后对两个数组同时从后往前遍历,直到不同的节点break。
代码
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if (!headA || !headB) return NULL;
vector<ListNode*> A;
vector<ListNode*> B;
while (headA) {
A.push_back(headA);
headA = headA->next;
}
while (headB) {
B.push_back(headB);
headB = headB->next;
}
int idxA = A.size() - 1, idxB = B.size() - 1;
while (idxA >= 0 && idxB >= 0) {
if (A[idxA] == B[idxB]){
idxA -- , idxB -- ;
} else {
break;
}
}
return idxA == A.size() - 1 ? NULL : A[idxA + 1];
}
};
复杂度分析
时间复杂度:\(O(n),n = n1 + n2\);
空间复杂度:\(O(n)\)。

浙公网安备 33010602011771号