合并两个排序的链表

本文使用两种方法实现两个排序链表的合并,一种是递归法,一种是循环法,其中循环法又用了两种方法,一个使用了队列,一个正常思路。代码中你会发现有释放内存的函数,但在main()函数中只对pHead调用,而对pHead1和pHead2并未调用,原因是深copy问题。参阅者可以自行查阅深copy问题或提出能将pHead,pHead1和pHead2同时调用的方法,本人愿意不吝赐教,非常感激!下面是C++代码:

//----------------合并两个排序的链表----------------

typedef struct LinkListNode
{
	int			 m_data;
	LinkListNode *m_next;
}LinkListNode;

LinkListNode *LinkListNode_Create()
{
	LinkListNode *pHead = NULL,*pCur = NULL,*PNew = NULL;

	pHead = (LinkListNode*)malloc(sizeof(LinkListNode));
	if(pHead == NULL)
		return NULL;
	pHead->m_data = 0;
	pHead->m_next = NULL;

	int data = 0;

	printf("Please input data:");
	scanf("%d",&data);
	if(data == -1)
		return NULL;
	pHead->m_data = data;

	pCur = pHead;
	printf("Please input data:");
	scanf("%d",&data);
	while(data != -1)
	{
		PNew = (LinkListNode*)malloc(sizeof(LinkListNode));
		if(PNew == NULL)
			return NULL;

		PNew->m_data = data;
		PNew->m_next = NULL;

		pCur->m_next = PNew;
		pCur = PNew;

		printf("Please input data:");
		scanf("%d",&data);
	}

	return pHead;
}

void PrintLinkListNode(LinkListNode *pHead)
{
	if(pHead == NULL)
		return;
	LinkListNode *tmp = pHead;
	while(tmp)
	{
		printf("%d  ",tmp->m_data);
		tmp = tmp->m_next;
	}
}

//方法一:递归法
LinkListNode *MergeLinkList_1(LinkListNode *pHead1, LinkListNode *pHead2)
{
	if(pHead1 == NULL)
		return pHead2;
	else if(pHead2 == NULL)
		return pHead1;

	LinkListNode *merge = (LinkListNode *)malloc(sizeof(LinkListNode));

	if (pHead1->m_data < pHead2->m_data)
	{
		merge = pHead1;
		merge->m_next = MergeLinkList_1(pHead1->m_next,pHead2);
	}
	else
	{
		merge = pHead2;
		merge->m_next = MergeLinkList_1(pHead1,pHead2->m_next);
	}

	return merge;
}

//方法二:循环一

LinkListNode *MergeLinkList_21(LinkListNode *pHead1, LinkListNode *pHead2)
{
	if(pHead1 == NULL || pHead2 == NULL)
		return NULL;

	LinkListNode *merge = NULL;
	LinkListNode *mergeHead = NULL;
	LinkListNode *tmp1 = pHead1;
	LinkListNode *tmp2 = pHead2;

	if(tmp1->m_data < tmp2->m_data)
	{
		mergeHead = pHead1;
		tmp1 = tmp1->m_next;
	}
	else
	{
		mergeHead = pHead2;
		tmp2 = tmp2->m_next;
	}
	merge = mergeHead;

	while(tmp1 != NULL && tmp2 != NULL)
	{
		if(tmp1->m_data < tmp2->m_data)
		{
			merge->m_next = tmp1;
			merge = tmp1;
			tmp1 = tmp1->m_next;
		}
		else
		{
			merge->m_next = tmp2;
			merge = tmp2;
			tmp2 = tmp2->m_next;
		}

	}
	while(tmp1 != NULL)
	{
		merge->m_next = tmp1;
		merge = tmp1;
		tmp1 = tmp1->m_next;
	}
	while(tmp2 != NULL)
	{
		merge->m_next = tmp2;
		merge = tmp2;
		tmp2 = tmp2->m_next;
	}
	
	return mergeHead;
}
//方法二:循环二
LinkListNode *MergeLinkList_22(LinkListNode *pHead1, LinkListNode *pHead2)
{
	if(pHead1 == NULL || pHead2 == NULL)
		return NULL;

	LinkListNode *merge = NULL;
	LinkListNode *mergeHead = NULL;
	LinkListNode *tmp1 = pHead1;
	LinkListNode *tmp2 = pHead2;

	std::queue<LinkListNode *> nodes;

	while(tmp1 != NULL && tmp2 != NULL)
	{
		if(tmp1->m_data < tmp2->m_data)
		{
			nodes.push(tmp1);
			tmp1 = tmp1->m_next;
		}
		else
		{
			nodes.push(tmp2);
			tmp2 = tmp2->m_next;
		}

	}
	while(tmp1 != NULL)
	{
		nodes.push(tmp1);
		tmp1 = tmp1->m_next;
	}
	while(tmp2 != NULL)
	{
		nodes.push(tmp2);
		tmp2 = tmp2->m_next;
	}

	mergeHead = nodes.front();
	nodes.pop();
	merge = mergeHead;

	LinkListNode *tmp = NULL;
	while(!nodes.empty())
	{
		tmp = nodes.front();
		merge->m_next = tmp;
		merge = tmp;
		nodes.pop();
	}
	return mergeHead;
}

int FreeLinkList(LinkListNode *pHead)
{
	if(pHead == NULL)
		return -1;
	LinkListNode* tmp = pHead;

	while(pHead)
	{
		tmp = pHead->m_next;
		free(pHead);
		pHead = NULL;
		pHead = tmp;
	}
	return 0;
}

int main()
{
	LinkListNode *pHead1 = NULL;
	LinkListNode *pHead2 = NULL;

	printf("the first linked list\n");
	pHead1 = LinkListNode_Create();
	if(pHead1 == NULL)
		return -1;
	printf("\nthe second linked list\n");
	pHead2 = LinkListNode_Create();
	if(pHead1 == NULL)
		return -1;

	PrintLinkListNode(pHead1);
	printf("\n");
	PrintLinkListNode(pHead2);
	printf("\n");

	LinkListNode *pHead = MergeLinkList_1(pHead1, pHead2);
	if(pHead == NULL)
		return -2;
	PrintLinkListNode(pHead);
	printf("\n");

	FreeLinkList(pHead);

	return 0;

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bixiwen_liu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值