数据结构考研学习笔记之线性表应用题(二)

本文探讨了如何找出两个单链表的公共节点,提出了一个高效算法。首先判断两链表尾节点是否相同,确定是否有公共部分。接着,通过计算长度差并调整遍历起点,实现同步遍历直至找到首个公共节点,避免了重复遍历,优化了时间复杂度。

给定两个单链表,编写算法找出两个链表的公众结点。

这道题笔者看到时比较蒙,经过一番努力才弄明白,现在将整理的思想写出来
方法:都在第一个链表上顺序遍历每个结点,每遍历一个结点,在第二个链表上顺序遍历所有结点,若找到两个相同结点,则找到它们的公众结点,该算法时间复杂度O(len1len2).
思想
***那么如何判断两个单向链表有没有公共点呢? 如果两个链表有一个公共点,那么这个公共结点后面的所有结点一定是重合的,这点是一定的,那么我们只需要判断两个链表的最后一个结点是否一样,如果尾结点一样那么就说明两个链表一定有重合的部分,一定有公共结点。但是遍历两个链表时并不能保证两个链表上同时到达尾结点。这是因为两个链表的长度可能不一样,所以这时就要知道两个链表的长度,分别遍历链表,得到链表的长度差k,长的那个链表先遍历k个结点,然后,两个一起遍历,直到找到相同的结点,或者一直到结束
实例代码:

LinkList Search_1st_Common(LinkList L1, LinkList L2)
{
	int len1 = Length(L1), len2 = Length(L2);//计算两个链表的表长
	LinkList longList, shortList;
	if(len1 > len2)
	{
		longList = L1->next; shortList = L2->next;
		dist = len1 - len2;                   //差
	}
	else
	{
		longList = L2->next; shortList = L1->next;
		dist = len2-len1;
	}
	while(dist--)//表长的链表先遍历到第dist个结点然后同步
		longList = longList ->next;
	while(longList!=NULL){
		if(longList == shortList->next)     //找到第一个相同结点
			return longList;
		else
		{
			longList = longList->next;
			shortList = shortList->next;
		}
		
	}
	return NULL;
}

本章介绍到此,希望对大家有帮助!!!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sf9090

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值