题目描述
输入两个链表,找出它们的第一个公共结点。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {}
};
*/
/*
首先遍历两个链表的长度,就能知道那个链表比较长,以及长链表比短链表长几个节点。
在第二次遍历的时候,先在长链表上走若干步,接着同时在两个链表上遍历,
找到第一个相同的节点就是它们的第一个公共节点。
*/
class Solution
{
public:
ListNode* FindFirstCommonNode(ListNode* pHead1, ListNode* pHead2)
{
//得到两个链表的长度
unsigned int length1 = Getlength(pHead1);
unsigned int length2 = Getlength(pHead2);
ListNode* pLong = pHead1;
ListNode* pShort = pHead2;
int length3 = length1 - length2;
if (length1 < length2)
{
pLong = pHead2;
pShort = pHead1;
int length3 = length2 - length1;
}
//现在长链表上走几步,在同时在两个链表上遍历
for (int i = 0; i < length3; i++)
pLong = pLong->next;
while ((pLong != nullptr) && (pShort != nullptr) && (pLong != pShort))
{
pLong = pLong->next;
pShort = pShort->next;
}
//得到第一个公共节点
ListNode* pFirst = pLong;
return pFirst;
}
unsigned int Getlength(ListNode* pHead)
{
unsigned int length = 0;
ListNode* pNode = pHead;
while (pNode != nullptr)
{
length++;
pNode = pNode->next;
}
return length;
}
};