剑指Offer:36-两个链表的第一个公共结点

题目描述

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

思路

  1. 还是老样子,没有思路的时候就已经有思路了,暴力法,总是有办法解决问题的。
  2. 但是暴力法不是最好的办法,我们要优化一下。

实现1-暴力法

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};*/
class Solution {
public:
    ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
        for(ListNode* p1 = pHead1; p1 != nullptr; p1 = p1->next)
        {
            for(ListNode* p2 = pHead2; p2 != nullptr; p2 = p2->next)
                if(p1 == p2)
                    return p1;
        }
        return nullptr;
    }
};

实现2-双指针

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};*/
class Solution {
public:
    ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
        int len1 = listSize(pHead1);
        int len2 = listSize(pHead2);
        ListNode* fast = len1 >= len2 ? pHead1 : pHead2;
        ListNode* slow = fast == pHead1 ? pHead2 : pHead1;
        for(int i = 0; i < abs(len1 - len2); i++)
            fast = fast->next;
        while(fast && slow)
        {
            if(fast == slow)
                return fast;
            fast = fast->next;
            slow = slow->next;
        }
        return nullptr;
    }
private:
    int listSize(ListNode* p)
    {
        int res = 0;
        while(p)
        {
            p = p->next;
            res++;
        }
        return res;
    }
};

你可能感兴趣的:(剑指Offer:36-两个链表的第一个公共结点)