37. 两个链表的第一个公共节点(C++版本)

实现代码:

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;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值