输入两个链表,找出它们的第一个公共结点。
法一:在链表一上顺序遍历每个结点,每遍历一个结点,顺序遍历链表二。时间复杂度为O(mn)
法二:利用两个辅助栈,遍历两个链表,将链表元素放入栈中,从栈顶取,直到两个元素不一致时结束,则对应的就为第一个公共结点,时间复杂度O(m+n),空间复杂度O(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) {
unsigned int len1=getlength(pHead1);
unsigned int len2=getlength(pHead2);
ListNode* plong=pHead1;
ListNode* pshort=pHead2;
int diff=0;
if (len1>=len2)
{
diff=len1-len2;
}
else
{
plong=pHead2;
pshort=pHead1;
diff=len2-len1;
}
for (int i=0;i<diff;i++)
{
plong=plong->next;
}
while(plong!=NULL&&pshort!=NULL&&plong!=pshort)
{
plong=plong->next;
pshort=pshort->next;
}
ListNode* node=plong;
return node;
}
unsigned int getlength(ListNode* pHead)
{
if (pHead==NULL)
return 0;
ListNode* p=pHead;
unsigned int num=0;
while(p!=NULL)
{
p=p->next;
num++;
}
return num;
}
};