首页 > 代码库 > Intersection of Two Linked Lists

Intersection of Two Linked Lists

Write a program to find the node at which the intersection of two singly linked lists begins.

 

For example, the following two linked lists:

A:          a1 → a2                   ↘                     c1 → c2 → c3                   ↗            B:     b1 → b2 → b3

begin to intersect at node c1.

 

Notes:

    • If the two linked lists have no intersection at all, return null.
    • The linked lists must retain their original structure after the function returns.
    • You may assume there are no cycles anywhere in the entire linked structure.
    • Your code should preferably run in O(n) time and use only O(1) memory.
/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {private:    int calcListLength(ListNode *head) {        int len = 0;        while (head) {            len++;            head = head->next;        }        return len;    }public:    ListNode *getIntersectionNode(ListNode* headA, ListNode* headB) {        int lenA = calcListLength(headA);        int lenB = calcListLength(headB);                if (lenA < lenB)        {            swap(headA, headB);            swap(lenA,lenB);        }        ListNode* pA = headA;        ListNode* pB = headB;        int n = lenA - lenB;        while (n--) {            pA = pA->next;        }            while (lenB--) {            if (pA == pB)                return pA;            pA = pA->next;            pB = pB->next;        }        return nullptr;    }};

 

Intersection of Two Linked Lists