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

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

这道题笔者看到时比较蒙,经过一番努力才弄明白,现在将整理的思想写出来
方法:都在第一个链表上顺序遍历每个结点,每遍历一个结点,在第二个链表上顺序遍历所有结点,若找到两个相同结点,则找到它们的公众结点,该算法时间复杂度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;
}

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

原创文章 27 获赞 68 访问量 1万+

猜你喜欢

转载自blog.csdn.net/sf9090/article/details/105980373