美文网首页链表
【剑指 offer】两个链表的第一个公共结点

【剑指 offer】两个链表的第一个公共结点

作者: 邓泽军_3679 | 来源:发表于2019-05-05 17:09 被阅读0次

    1、题目描述

    输入两个链表,找出它们的第一个公共结点。

    当不存在公共节点时,返回空节点。

    样例

    给出两个链表如下所示:
    A:   a1 → a2
                ↘
                  c1 → c2 → c3
                ↗
    B: b1 → b2 → b3

    输出第一个公共节点c1

    2、问题描述:

    3、问题关键:

    • 如果有公共结点肯定是在后面重叠,且后面部分都是共同的。
    • 方法1:先计算出两个链表的长度,可以让比较长的先走两个链表长度之差的步数,两个再一起走。
    • 方法2:不同部分为a, 和b,公共部分为c;a + c + b = b + c + a;让两个一起走,a走到头就转向b, b走到头转向a,则在公共部分相遇。

    4、C++代码:

    方法1:
    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode *findFirstCommonNode(ListNode *headA, ListNode *headB) {
            auto p = headA, q = headB;
            int la = 0, lb = 0;
            for (auto t = headA; t; t = t->next) la ++;
            for (auto t = headB; t; t = t->next) lb ++;
            int k = la - lb;
            if (la < lb) {
                p = headB, q = headA;
                k = lb - la;
            }
            while(k --) {
                p = p->next;
            }
            while(p) {
                if (p == q) return p;
                p = p->next;
                q = q->next;
            }
            return nullptr;
        }
    };
    
    方法2:
    class Solution {
    public:
        ListNode *findFirstCommonNode(ListNode *headA, ListNode *headB) {
            auto p = headA, q = headB;
            while(p != q) {
                if(p) p = p->next;
                else p = headB;
                if (q) q = q->next;
                else q = headA;
            }
            return p;
        }
    };
    

    相关文章

      网友评论

        本文标题:【剑指 offer】两个链表的第一个公共结点

        本文链接:https://www.haomeiwen.com/subject/pxmhoqtx.html