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;
    }
};

 

posted @ 2016-10-02 20:52  wxquare  阅读(157)  评论(0编辑  收藏  举报