实现代码:
int GetListLength(ListNode* pHead)
{
if (nullptr == pHead) return 0;
int listLen = 0;
ListNode* pCurNode = pHead;
while (pCurNode != nullptr)
{
++listLen;
pCurNode = pCurNode->pNext;
}
return listLen;
}
ListNode* GetFirstCommonNode(ListNode* pHead1, ListNode* pHead2)
{
if (nullptr == pHead1 || nullptr == pHead2) return nullptr;
int list1Len = GetListLength(pHead1);
int list2Len = GetListLength(pHead2);
ListNode* pCurNode1 = pHead1;
ListNode* pCurNode2 = pHead2;
// 前进的节点
ListNode*& pNeedAdvanceNode = (list1Len > list2Len ? pCurNode1 : pCurNode2);
// 前进的步数
int advanceLen = list1Len > list2Len ? (list1Len - list2Len) : (list2Len - list1Len);
// 节点前进
for (int idx = 0; idx < advanceLen; ++idx) pNeedAdvanceNode = pNeedAdvanceNode->pNext;
while (pCurNode1 != nullptr && pCurNode2 != nullptr)
{
if (pCurNode1 == pCurNode2) return pCurNode1;
pCurNode1 = pCurNode1->pNext;
pCurNode2 = pCurNode2->pNext;
}
return nullptr;
}