题目描述:
给出两个单链表,找出它们的共同结点。
算法思路:
两个单链表有公共结点,即两个链表从某一个结点开始,他们的next都指向同一个结点。由于每个单链表结点只有一个next域,因此从第一个公共结点开始,之后它们所有的结点都是重合的,不可能出现分叉,则其拓扑结构类似于Y。
可以先遍历两个链表分别得到它们的长度,并求出两个的长度之差。在长的链表上先遍历长度差个结点之后,再同步遍历两个链表,直到找到它们的相同结点,或者一直到链表结束。
代码如下:
LinkList Search_Commom(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)
return longList;
else{
longList=longList->next;
shortList=shortList->next;
}
}
return NULL;
}