剑指offer52 两个链表的第一个公共结点
输入两个链表,找出它们的第一个公共结点。
当不存在公共节点时,返回空节点。
样例
给出两个链表如下所示:
A: a1 → a2
↘
c1 → c2 → c3
↗
B: b1 → b2 → b3
输出第一个公共节点c1
思路1:
先遍历一遍两个链表,计算出两个的长度headAnums和headBnums,然后对于较长的一个链表先走完长出来的那一块,然后再共同走,并判断是不是共同的结点.时间复杂度为O(n).其中假设n为较长的链表的长度.
C++ code:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *findFirstCommonNode(ListNode *headA, ListNode *headB) {
int headAnums = 0, headBnums = 0;
ListNode *tempA = headA;
ListNode *tempB = headB;
while(tempA){
headAnums++;
tempA = tempA->next;
}
while(tempB){
headBnums++;
tempB = tempB->next;
}
while(headAnums > headBnums){
headAnums--;
headA = headA->next;
}
while(headBnums > headAnums){
headBnums--;
headB = headB->next;
}
while(headA != headB){
headA = headA->next;
headB = headB->next;
}
return headA;
}
};
思路1:
用unordered_map<ListNode*, int> nodes记录结点是否出现过. 首先遍历一遍第一个链表,并且把该链表的所有结点放入到nodes, 然后遍历第二个链表,判断第二个链表中结点是否在nodes出现过,返回第一个出现过的结点. 时间复杂度为O(m+n),空间复杂度为O(n)