题目描述:
输入两个链表,找出它们的第一个公共结点。
分析:
完整代码:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
//声明两个变量 Length1 和 Length2 分别表示链表的长度
int Length1 = GetListLength(pHead1);
int Length2 = GetListLength(pHead2);
//声明一个变量 nLength, 用来表示链表的长度差
int nLength = Length1 - Length2;
//声明两个链表指针 pNode1、pNod2 分别指向两个链表
ListNode *pNode1 = pHead1;
ListNode *pNode2 = pHead2;
//如果 链表2 比链表1 长
if(Length2 > Length1)
{
//互换两指针所指的链表
pNode1 = pHead2;
pNode2 = pHead1;
nLength = Length2 - Length1;
}
//长的链表先走 nLength
for( int i = 0; i<nLength; ++i)
pNode1 = pNode1->next;
//如果两个链表指针所指的节点不为空且两者不相等
while(pNode1 != nullptr && pNode2 != nullptr && pNode1 != pNode2)
{
pNode1 = pNode1->next;
pNode2 = pNode2->next;
}
//声明一个标量 ComNode
ListNode* ComNode = pNode1;
//返回公共节点
return ComNode;
}
private:
int GetListLength(ListNode* pHead)
{
//声明一个变量 ListLength, 表示链表的长度
int ListLength = 0;
//声明一个链表指针 pNode,指向链表的头节点
ListNode* pNode = pHead;
//如果所指的节点不为空
while( pNode != nullptr)
{
++ListLength;
pNode = pNode->next;
}
//返回链表的长度
return ListLength;
}
};