给定两个单链表,编写算法找出两个链表的公众结点。
(这道题笔者看到时比较蒙,经过一番努力才弄明白,现在将整理的思想写出来)
方法:都在第一个链表上顺序遍历每个结点,每遍历一个结点,在第二个链表上顺序遍历所有结点,若找到两个相同结点,则找到它们的公众结点,该算法时间复杂度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;
}
本章介绍到此,希望对大家有帮助!!!