实现代码:
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;
}
本文介绍了一种高效算法,用于查找两个链表的第一个公共节点。通过先计算两链表长度,再调整较长链表的起点,实现同步遍历比较,从而定位首个相交点。
1052

被折叠的 条评论
为什么被折叠?



