两个链表的第一个公共节点

来源于我的博客

题目描述

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

/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
        val(x), next(NULL) {
}
};*/  

例如:
1-2-4
   6-7
 3-5
两者第一个公共节点是6,两链表长度可能不一,但尾节点到第一个公共节点的长度是一致的。


常规解:栈

时间复杂度o(n),用两个栈各自保存两个链表,最后栈顶一定是相等的(如果有公共节点的话)

class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
    ListNode* t1=pHead1;
    ListNode* t2=pHead2;
    vector<ListNode*> stk1;
    vector<ListNode*> stk2;

    if(pHead2==nullptr||pHead1==nullptr)
        return nullptr;
    if(pHead2==pHead1) /*注意特殊情况的处理*/
        return pHead2;

    while(t1!=nullptr){
        stk1.push_back(t1);
        t1=t1->next;
    }
    while(t2!=nullptr){
        stk2.push_back(t2);
        t2=t2->next;
    }

    if(stk1.back()!=stk2.back())
        return nullptr;
    ListNode* pCommon=nullptr;

    while(stk1.back()==stk2.back()){
        pCommon=stk1.back();
        stk1.pop_back();
        stk2.pop_back();
    }

    return pCommon;
}
};

代码最短:

两个指针一直步进,直到两者第一次相等,即得到第一个公共节点
例如:
12467|12467 |12467 |124 67
35673|56735|67356|735 67

class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1,     ListNode* pHead2) {
    ListNode* t1=pHead1;
    ListNode* t2=pHead2;
    while(t1!=t2){
        t1=(t1==nullptr ? pHead1:t1->next);
        t2=(t2==nullptr ? pHead2:t2->next);
    }
    return t1;
}
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值