码迷,mamicode.com
首页 > 其他好文 > 详细

两个链表的第一个公共结点(剑指offer)+链表

时间:2015-10-01 20:35:55      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:剑指offer   链表   

两个链表的第一个公共结点
  • 参与人数:1171时间限制:1秒空间限制:32768K
  • 通过比例:31.25%
  • 最佳记录:0 ms|0K(来自  running

题目描述

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

链接:http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 

链表的操作 可谓是面试一经常的考点。

这题注意几个测试用例:1、空链表;2、两个链表重合;3、两个链表没有公共结点,即不重合;4、其中一个链表表头在另一个链表内;5、一般情况


那么怎么解决这个问题呢。考虑  o---o---o---o---o

                                                                -

                                                                -

                                                                -

                                                                o         (红色的表示另外一条链表)


如果过说蓝色的为第一个公共点,那么如果从表尾开始往前走就是最后一个公共点,可惜链表一般指的单链表,如果是双链表这题就没有意义了。既然不能从表尾开始,那么只能从表头开始了;


我们可以把上面的情况用栈来实现,先压入栈,然后再弹出,相当于从尾到头!O(m+n)只不过用了赋值空间


但是我们还可以有更好的办法。解法类似于找环的入口结点,这里也是,如果链表一的长度是5、链表二的长度数4,那我就让链表一,先走一步,再一走,那么他们相遇的点就是第一个公共结点; 如果到表尾还没相遇说明没有公共点。


#include<cstdio>

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) return pHead1;
        if(!pHead2) return pHead2;
        
        int len1=0,len2=0;
        ListNode *p1,*p2;
        p1=pHead1;
        p2=pHead2;
        while(p1)
        {
            len1++;
            p1=p1->next;
        }
        while(p2)
        {
            len2++;
            p2=p2->next;
        }
        p1=pHead1;
        p2=pHead2;
        if(len1>len2)
        {
            while(len1>len2)
            {
                p1=p1->next;
                --len1;
            }
        }
        else
        {
            while(len1<len2)
            {
                p2=p2->next;
                --len2;
            }
        }
        while(p1)
        {
            if(p1==p2) return p1;
            p1=p1->next;
            p2=p2->next;
        }
        return p1;
    }
};






版权声明:本文为博主原创文章,未经博主允许不得转载。

两个链表的第一个公共结点(剑指offer)+链表

标签:剑指offer   链表   

原文地址:http://blog.csdn.net/u010579068/article/details/48847943

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!