题目描述
输入两个链表,找出它们的第一个公共结点。
如果是暴力法的话(类似字符串匹配),复杂度o(m*n)
利用栈,从尾部开始遍历的话,复杂度o(m+n) 空间复杂度o(m+n)
下面的方法,o(m+n), 不需要栈,首先记录两个链表的长度,较长的先走abs(l1-l2)步,然后再一起走,直到找到第一个公共节点。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
int pLength1=0,pLength2=0;
ListNode* pIter1=pHead1;
ListNode* pIter2=pHead2;
// 先遍历一轮,记录长度
while (pIter1!=NULL)
{
pLength1++;
pIter1=pIter1->next;
}
while(pIter2!=NULL) {
pLength2++;
pIter2=pIter2->next;
}
pIter1=pHead1;
pIter2=pHead2;
// 较长的先走abs(l1-l2)步
if(pLength1>pLength2) {
int i=pLength1-pLength2;
while(i>0) {
pIter1=pIter1->next;
i--;
}
} else {
int i=abs(pLength1-pLength2);
while(i>0) {
pIter2=pIter2->next;
i--;
}
}
// 再一起走
while(pIter2!=NULL&&pIter1!=NULL) {
if(pIter2==pIter1) {
return pIter2;
}
pIter1=pIter1->next;
pIter2=pIter2->next;
}
return NULL;
}
};