/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
int lenList(ListNode* pHead)
{
if(pHead == NULL) return 0;
int res=1;
while(pHead->next != NULL)
{
pHead=pHead->next;
res++;
}
return res;
}
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
int len1,len2;
len1=lenList(pHead1);
len2=lenList(pHead2);
while(len1> len2)
{
pHead1=pHead1->next;
len1--;
}
while(len2 > len1)
{
pHead2=pHead2->next;
len2--;
}
while(pHead1 != NULL && pHead1 != pHead2)
{
pHead1=pHead1->next;
pHead2=pHead2->next;
}
return pHead1;
}
};
上面的思路:根据长度问题,较长的链表提前走两步啊,走两步。
下面的思路,利用栈的先进后出的原理
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
#include<stack>
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
stack<ListNode*> l1;
stack<ListNode*> l2;
if(!pHead1 ||!pHead2) return NULL;
// push into stack
while(pHead1)
{
l1.emplace(pHead1);
pHead1=pHead1->next;
}
while(pHead2)
{
l2.emplace(pHead2);
pHead2=pHead2->next;
}
ListNode* tm1=l1.top();l1.pop();
ListNode* tm2=l2.top();l2.pop();
while(!l1.empty()&& !l2.empty()&&tm1 == tm2)
{
tm1=l1.top();l1.pop();
tm2=l2.top();l2.pop();
}
if(l1.empty()||l2.empty()) return tm1;
return tm1->next;
}
};