【面试题】剑指Offer-37-求两个链表的第一个公共节点

本文介绍了一种高效算法来找到两个已知相交的链表的首个公共节点。通过计算链表长度并调整起点,使得两个链表能在同一位置相遇。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目概述


解题思路


首先,分别求出两个链表L1,L2的长度L1_length,L2_length

比较L1_length,L2_length的大小,并求出差值的绝对值K

定义两个指针cur1,cur2,分别指向两个链表

令长度较长的链表先走K步

然后同时走,直到两个指针指向的位置相同停止

注意:题目要求的是求两个链表的第一个公共节点,这里我们假设已经确定两条链表是相交的了

代码实现

int ListLength(ListNode* phead)
{
	int count = 0;
	ListNode* cur = phead;
	while (cur)
	{
		count++;
		cur = cur->next;
	}
	return count;
}

//假定两条链表是一定相交的
ListNode* FindCommonNode(ListNode** phead1,ListNode** phead2)
{
	int l1_length = ListLength(*phead1);
	int l2_length = ListLength(*phead2);
	ListNode* cur1 = *phead1;
	ListNode* cur2 = *phead2;

	if (l1_length > l2_length)
	{
		int tmp = l1_length - l2_length;
		while (tmp--)
			cur1 = cur1->next;
	}

	if (l1_length < l2_length)
	{
		int tmp = l2_length - l1_length;
		while (tmp--)
			cur2 = cur2->next;
	}

	while (cur1 != cur2)
	{
		cur1 = cur1->next;
		cur2 = cur2->next;
	}

	return cur1;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值