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

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

被折叠的 条评论
为什么被折叠?



