面试题37:两个链表的第一个公共节点

本文探讨了通过两种不同算法解决寻找两个链表首个公共节点的问题。一种算法使用集合存储链表元素,复杂度为O(m*lgm+n*lgn);另一种算法采用巧妙的方法同步遍历两个链表,复杂度为O(m+n)。

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

     这一题我考虑的是,先分别求出每个链表的长度,然后用一个set收集所有的值。因为set中不允许有重复的值。那么两个链表的长度和减去set的size就是公共链表的长度,再从头遍历下,即可求得。算法的复杂度是O(m*lgm+n*lgn).m,n分别为链表的长度。

     代码如下:

     

struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};
class Solution {
public:
    ListNode* FindFirstCommonNode( ListNode *pHead1, ListNode *pHead2) {
        int num1=0,num2=0;
        set<int> numset;
        ListNode* temp1=pHead1;
        ListNode* temp2=pHead2;
        while(temp1)
        {
            numset.insert(temp1->val);
            temp1=temp1->next;
            num1++;
        }
        while(temp2)
        {
            numset.insert(temp2->val);
            temp2=temp2->next;
            num2++;
        }    
        int len=num1-(num1+num2-numset.size());
        int i;
        ListNode* newhead=pHead1;
        for(i=0;i<len;i++)
        {
            newhead=newhead->next;
        }
        return newhead;
    }
};
      书上有一种O(m+n)的解法。思想是类似的。但是它并没有用一个set去保存数值。而是先分别求得链表的长度,然后对于长的链表,先走len(长的-短的),然后再一起走,第一个达到相同的节点值即为所求。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值