考研数据结构(每日一题)
题目:给定两个单链表,编写算法找出两个链表的公共结点。
算法图解:
算法思想:
1.两个链表长度一样
2.两个链表长度不一样
3.分别遍历两个链表并得到长度,求出长度之差。在长的链表上先遍历长度之差个结点之后,在同步遍历两个链表,直到找到相同的结点
完整代码:
LinkList Search_lst_Common(LinkList L1,LinkList L2){
int len1 = Length(L1),len2 = Length(L2); //计算两个链表的表长
LinkList *longList,shortList; //分别指向表长较长和较短的链表
if(len1 > len2){ //L1大于L2的表长
longList = L1 -> next;
shortList = L2 -> next;
dist = len1 - len2; //表长之差
}else{ //L2小于L2的表长
longList = L2 -> next;
shortList = L1 -> next; //表长之差
}
while(dist--){ //表长的链表先遍历到第dist个结点,然后同步
longList = longList ->next;
}
while(longList != NULL){ //同步找共同结点
if(longList == shortList){ //找到第一个公共结点
return longList;
}else{ //继续同步寻找
longList = longList -> next;
shortList = shortList -> next;
}
}
return NULL;
}