算法学习-单链表公共结点问题

题目

得定两个单向链表,计算两个链表的第一个公共结点,若没有公共结点,返回空。

分析

令两个链表的长度为m、n,不放认为m>=n,由于两个链表从第一个公共结点到链表的为节点是完全重合的。所以前面的(m-n)个结点一定没有公共结点。

先分别遍历两个链表得到他们的长度m,n。长链表空转|m-n|次,同步遍历两链表,知道找到相同结点或到链表结束。

时间复杂度为O(m+n)。

代码如下:

int CalcLength(SNode* p)
{
	int nLen = 0;
	while (p)
	{
		p = p->pNext;
		nLen++
	}
	return nLen;
}

SNode* FindFirstSameNode(SNode* pA, SNode* pB)
{
	pA = pA->pNext;
	pB = pB->pNext;

	int nA = CalcLength(pA);
	int nB = CalcLength(pB);
	if (nA > nB)
	{
		SNode* pTmp = pA;
		pA = pB;
		pB = pTmp;
		int nTmp = nA;
		nA = nB;
		nB = nTmp;
	}

	for (int i = 0; i < nB - nA; i++)
	{
		pB = pB->pNext;
	}

	while (pA)
	{
		if (pA = pB)
		{
			return pA;
		}
		pA = pA->pNext;
		pB = pB->pNext;
	}
	return NULL;
}


在单链表公共结点问题中,如果是链表存在环,则需要使用快慢指针的方式计算公共结点,两个指针每次移动一个/两个结点

通过这几次的算法学习之链表问题可以看出,纯链表的题目往往不难,但需要扎实的Coding基本功,在实现过程中要特别小心next的指向,此外,删除结点是一定要确保该结点不在需要。

小心引用类型的指针


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值