35 两个链表的第一个公共结点

题目描述

输入两个链表,找出它们的第一个公共结点。
 
思路:这里首先理解一下暴力的方法,对于链表1的每一个节点,都去链表2中查找是否有该节点。
然后自己在思考的时候陷入了是否有环链表,这道题目不需要考虑是否有环,因为有环其实就是一个链表。
这题使用快慢指针,先得到两个链表的长度,定义两个头结点,哪个长就是p1,短的就是p2,长的先走len1 -
len2,然后两个指针一起走,相交的时候就是第一个交点。
 
/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};*/
class Solution {
public:
    ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
        if(pHead1 == nullptr || pHead2 == nullptr){
            return nullptr;
        }
        ListNode* p1 = pHead1,*p2 = pHead2;
        int len1 = 0,len2 = 0;
        while(p1 != nullptr){
            ++len1;
            p1 = p1 -> next;
        }
        while(p2 != nullptr){
            ++len2;
            p2 = p2 -> next;
        }
        p1 = pHead1;
        p2 = pHead2;
        if(len1 < len2){
             p1 = pHead2;
             p2 = pHead1;
        }
        for(int i = 0;i < abs(len1 - len2);++i){
            p1 = p1 -> next;
        }
        while(p1 != nullptr && p2 != nullptr){
            if(p1 -> val == p2 -> val){
                return p1;
            }
            else{
                p1 = p1 -> next;
                p2 = p2 -> next;
            }
        }
        return nullptr;
    }
};

 

posted @ 2018-01-04 16:25  zqlucky  阅读(139)  评论(0编辑  收藏  举报