因为两个链表长度不一致 又长又短 而后面部分是公共的,所以求出长链表长度和短链表长度
让长链表把他俩之间的差距先走完,然后两个链表并行的走,直到碰到第一个相同的节点
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
if(pHead1==nullptr||pHead2==nullptr)
return nullptr;
ListNode * pHeadnew1=pHead1;
ListNode * pHeadnew2=pHead2;
unsigned int length1=getlistlength(pHeadnew1);
unsigned int length2=getlistlength(pHeadnew2);
unsigned int distance;
if(length1>length2)
{
distance =length1-length2;
while(distance)
{
pHeadnew1=pHeadnew1->next;
--distance;
}
} else
{
distance =length2-length1;
while(distance)
{
pHeadnew2=pHeadnew2->next;
--distance;
}
}
//链表在此处已经对齐了
while(pHeadnew1!=pHeadnew2&&(pHeadnew1!=nullptr)&&(pHeadnew2!=nullptr))//是相同节点
{
pHeadnew1=pHeadnew1->next;
pHeadnew2=pHeadnew2->next;
}
ListNode * pfirstcommon = pHeadnew1;
return pfirstcommon;
}
public:
unsigned int getlistlength(ListNode* phead)
{
if (phead==nullptr)
return 0;
unsigned int length=0;
while(phead)
{
phead = phead->next;
length++;
}
return length;
}
};