题目描述
输入两个链表,找出它们的第一个公共结点。
分析
可以采用两种办法:
1、采用两个节点,分别从头到尾遍历一遍,得到两个链表的长度差k,然后再采用两个相差k距离节点指针向前跳动,空间复杂度O(1),时间复杂度O(n)
2、采用两个堆栈,把节点全部压入,然后出栈,直到最后一个公共节点。空间复杂度O(n),时间复杂度O(n)
代码实现
指针版本 比长度
ListNode* FindFirstCommonNode ( ListNode* pHead1, ListNode* pHead2) {if(!pHead1||!pHead2)
return NULL;
int len1=0,len2=0;
int step = 0;
ListNode*p1=pHead1;
while(p1!=NULL){
len1++;
p1=p1->next;
}
ListNode*p2=pHead2;
while(p2!=NULL){
len2++;
p2=p2->next;
}
链表内存不是指针,不能直接相加的
p1=pHead1;
p2=pHead2;
if(len1>len2){
step = len1-len2;
while(step-->0) p1=p1->next;
}
else {
step = len2-len1;
while(step-->0) p2=p2->next;
}
while( (p1!=NULL) && (p2!=NULL)){
if(p1==p2){
return p1;
}
p2=p2->next;
p1=p1->next;
}
return NULL;
}
堆栈版本
ListNode* FindFirstCommonNode2( ListNode* pHead1, ListNode* pHead2) {
if(!pHead1||!pHead2)
return NULL;
ListNode*p1=pHead1;
while(p1!=NULL){
S1.push(p1);
p1=p1->next;
}
ListNode*p2=pHead2;
while(p2!=NULL){
S2.push(p2);
p2=p2->next;
}
ListNode*q=NULL;
while( !S1.empty() && !S2.empty() ){
if( S1.top() == S2.top()){
q = S1.top();
S1.pop();
S2.pop();
}
else{
break;
}
}
return q;
}
stack<ListNode*>S1;
stack<ListNode*>S2;