剑指 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)\)

posted @ 2023-04-09 00:01  lixycc  阅读(14)  评论(0)    收藏  举报