C++ 两个链表的第一个公共结点

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

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

数据范围
链表长度 [1,2000]

保证两个链表不完全相同,即两链表的头结点不相同。

样例
给出两个链表如下所示:
A: a1 → a2

c1 → c2 → c3

B: b1 → b2 → b3

输出第一个公共节点c1

思想:通过双指针遍历两个链表,先同时遍历至链表末尾。若其中一个链表遍历结束,则将其指针重新指向另一链表头,并继续遍历。这样,两个指针最终相遇的节点即为第一个公共节点(因为走过的长度相等),同样适用于不相交的两个链表,因为在第二次遍历时会同时走到链表的结尾,同时为空。

/**
 * 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;
        while(p && q) {
            p = p->next;
            q = q->next;
        }
        if(!p) {
            p = headB;
            while(q){
                q = q->next;
                p = p->next;
            }
            
            q = headA;
            while(q != p) {
                q = q->next;
                p = p->next;
            }
            return p;
        } else {
            q = headA;
            while(p){
                q = q->next;
                p = p->next;
            }
            p = headB;
            while(q != p) {
                q = q->next;
                p = p->next;
            }
            return p;
        }
    }
};

然后看到大佬写的简洁版本,嗯,差距就出来了…加油

/**
 * 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;
        while(p != q) {
            if(p) p = p->next;
            else p = headB;
            if(q) q = q->next;
            else q = headA;
        }
        return p;
    }
};

555 菜要多练qwq

你可能感兴趣的:(力扣,链表,c++,链表)