题目描述
输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
思路:
我们先得出两个链表的长度,然后将长的那一个先走两个的差值,然后我们让两个同时开始走,走一步判断一下。直到两个为空,或者找到相同的节点!
代码
/*
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;
int length1=getlen(pHead1);
int length2=getlen(pHead2);
ListNode* p1=pHead1;
ListNode* p2=pHead2;
if(length1>length2)
{
for(int i=0; i<lenght1-length2;i++)
p1=p1->next;
while(p1!=p2) //两者都为空。到达尾节点时也相同
{
p1=p1->next;
p2=p2->next;
}
}
else
{
for(int i=0; i<lenght2-length1;i++)
p2=p2->next;
while(p1!=p2) //两者都为空。到达尾节点时也相同
{
p1=p1->next;
p2=p2->next;
}
}
if(p1==nullptr || p2==nullptr)
return nullptr;
else
return p1;
}
private:
int getlen(ListNode* p)
{
int count=0;
while(p!=nullptr)
{ count++;
p=p->next;
}
return count;
}