假设有两个单链表,头结点分别为 list1, list2, 如果 list1为空,直接返回 list2,如果list2为空,直接返回 list1,如果两个链表均存在,那么这两个链表进行逐个元素的比较,如果list1中的元素大于 list2的,将list2的值保存到合并链表中,否则,将list1中的值保存到合并链表中去,如果任何一个链表遍历结束,将另外一个链表的余下部分保存到合并链表中去
LinkedList *MergeLinkedList(LinkedList *MergeList, LinkedList *list1, LinkedList *list2)
{
if (list1 == NULL && list2 != NULL) return list2;
if (list1 != NULL && list2 == NULL) return list1;
if (list1 == NULL && list2 == NULL)
{
printf("待合并链表均为空,无需合并!\n");
return NULL;
}
if (MergeList == NULL)
{
printf("保留合并结果的链表创建失败!\n");
return NULL;
}
LinkedList *p1, *p2;
p1 = list1;//用来循环遍历链表 list1
p2 = list2;//用来循环遍历链表 list2
/* 交替遍历两个链表 */
int MergeValue = 0;//每次保存两个链表中较小值,然后保存到合并链表 MergeList中去
LinkedList *TempMergeNode = MergeList; //开始赋值为合并存储链表的头结点
while (p1->next != NULL && p2->next != NULL)
{
if (p1->next->iValue >= p2->next->iValue)
{
MergeValue = p2->next->iValue;
p2 = p2->next;
}
else
{
MergeValue = p1->next->iValue;
p1 = p1->next;
}
//将链表1和链表2节点中的较大值存入合并链表节点中
{
LinkedList *MergeNode = (LinkedList *)malloc(sizeof(LinkedList));
if (MergeNode==NULL)
{
printf("链表创建失败!\n");
return NULL;
}
MergeNode->iValue = MergeValue; //采用尾插法创建合并链表
MergeNode->next = NULL;
TempMergeNode->next = MergeNode;
TempMergeNode = MergeNode;
}
}
if (p1->next != NULL && p2->next==NULL)//链表 list2 长度小于 list1,余下部分保存到 合并链表中
{
TempMergeNode->next = p1->next;
return MergeList;
}
else if (p1->next ==NULL && p2->next != NULL) //链表 list2 长度大于 list1,余下部分保存到 合并链表中
{
TempMergeNode->next = p2->next;
return MergeList;
}
}
int main()
{
LinkedList *MList, *list1, *list2;
MList = InitialLinkedList();//创建单链表头结点
list1 = InitialLinkedList();
list2 = InitialLinkedList();
CreateLinkedList(list1);//创建带头结点的单链表
CreateLinkedList(list2);
MergeLinkedList(MList, list1, list2);//合并两个有序单链表
PrintLinkedList(MList);//打印显示单链表中的元素
getchar();
return 0;
}