leetcode-剑指 Offer 52. 两个链表的第一个公共节点

leetcode-剑指 Offer 52. 两个链表的第一个公共节点
输入两个链表,找出它们的第一个公共节点。
如下面的两个链表:
leetcode-剑指 Offer 52. 两个链表的第一个公共节点_第1张图片
在节点 c1 开始相交。
示例 1:
leetcode-剑指 Offer 52. 两个链表的第一个公共节点_第2张图片
解题思路:
从示例1的附图可以发现:交点并不是数值相等的点,而是指针相等的点。
双指针分别遍历链表A,链表B,当一个链表遍历结束后,他的指针指向另一个链表的头结点,最终会在某一个节点处相遇。
举个例子:
A路程为: L1+C;
B路程为:L2+C;
其中C代表公共的部分
当两个人都走过L1+L2+C时,也就是走过的路程相同,会相遇。

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        if(headA==NULL||headB==NULL) return NULL;
        ListNode * p=headA;
        ListNode * q=headB;
        while(p!=q)
        {
            p=p->next;
            q=q->next;
            if(p==NULL&&q!=NULL) p=headB;
            if(p!=NULL&&q==NULL) q=headA;
        }
        return p;
    }
};

此题还有另外一种做法:让长度长的链表先走|A链表长度-B链表长度|的距离,然后两个链表再同时走,知道找到相等的位置,返回结果。

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode* pA = headA;
        ListNode* pB = headB;
        int lenA = 0, lenB = 0;
        while (pA != NULL) { // 求链表A的长度
            lenA++;
            pA = pA->next;
        }
        while (pB != NULL) { // 求链表B的长度
            lenB++;
            pB = pB->next;
        }
        pA = headA;
        pB = headB;
        //保证pA为长链表,lenA为其长度
        if (lenB > lenA) {
            swap (lenA, lenB);
            swap (pA, pB);
        }
        int x = lenA - lenB;    // 求两个链表距离的差值
        while (x--) {
           pA =pA->next;
        }
        while (pA != NULL) {
            if (pA!= pB) {
              pA = pA->next;
              pB =pB->next;
            }
            else
               return pA;
        }
        return NULL;
    }
};



你可能感兴趣的:(剑指offer,链表,指针)