链表的操作 可谓是面试一经常的考点。
这题注意几个测试用例: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; } };
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/u010579068/article/details/48847943