您的位置:首页 > 其它

将两个有序单链表合并

2015-07-31 21:43 375 查看
假设有两个单链表,头结点分别为 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: