题目:输入两个链表,找出它们的第一个公共结点。
这一题我考虑的是,先分别求出每个链表的长度,然后用一个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(长的-短的),然后再一起走,第一个达到相同的节点值即为所求。
本文探讨了通过两种不同算法解决寻找两个链表首个公共节点的问题。一种算法使用集合存储链表元素,复杂度为O(m*lgm+n*lgn);另一种算法采用巧妙的方法同步遍历两个链表,复杂度为O(m+n)。
1513

被折叠的 条评论
为什么被折叠?



