[LeetCode系列] 双单链表共同节点搜索问题

找到两个单链表的共同节点.

举例来说, 下面两个链表A和B:

A:          a1 → a2

                   ↘

                     c1 → c2 → c3

                   ↗            

B:     b1 → b2 → b3

共同节点为c1.

 

分析:

共同节点距离A,B的起点headA, headB的距离差为定值, 等于它们的各自总长的差值, 我们只需要求出这个差值, 把两个链表的头移动到距离c1相等距离的起点处即可.

代码:

/**

 * Definition for singly-linked list.

 * struct ListNode {

 *     int val;

 *     ListNode *next;

 *     ListNode(int x) : val(x), next(NULL) {}

 * };

 */

class Solution {

public:

    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {

        int deltaLength = getLengthOfList(headA) - getLengthOfList(headB);

        // A > B

        if (deltaLength > 0)

        {

            while (deltaLength-- > 0) headA = headA->next;

        }

        // A < B

        else if (deltaLength < 0)

        {

            while (deltaLength++ < 0) headB = headB->next;

        }

        // now A and B has the same distance to intersection node

        while (NULL != headA && NULL != headB)

        {

            if (headA == headB)

                return headA;

            headA = headA->next;

            headB = headB->next;

        }

        return NULL;

    }

    

    int getLengthOfList(ListNode *head)

    {

        int res = 0;

        while (NULL != head)

        {

            res++;

            head = head->next;

        }

        return res;

    }

};

 

你可能感兴趣的:(LeetCode)