写正确函数需要注意的地方:链表的合并排序

Node* mergeSort(Node* head, int length)
{
	if(length==0)
		return NULL;
	if(length==1)
	{
		head->pNext=NULL;//一定要赋值为NULL,否则可能出现死循环。
		return head;
	}

	int halflength=length/2;
	Node* halfp=head;
	for(int i=0;i<halflength;++i)
		halfp=halfp->pNext;

	Node* p1=mergeSort(head, halflength);
	Node* p2=mergeSort(halfp,length-halflength);


	//merge部分
	Node* result=NULL;
	if(p1->value>p2->value)
	{
		result=p2;
		p2=p2->pNext;
	}
	else
	{
		result=p1;
		p1=p1->pNext;
	}

	Node* tail=result;

	while(p1!=NULL && p2!=NULL)
	{
		if(p1->value>p2->value)
		{
			tail->pNext=p2;
			tail=tail->pNext;
			p2=p2->pNext;
		}
		else
		{
			tail->pNext=p1;
			tail=tail->pNext;
			p1=p1->pNext;
		}
	}
	tail->pNext=(p1==NULL?p2:p1);

	return result;
}

Node* mergeSort(Node* head)
{
	if(head==NULL || head->pNext==NULL)
		return head;

	int length=0;
	Node* cur=head;
	for(;cur!=NULL;cur=cur->pNext)
		++length;

	mergeSort(head,length);
}

int _tmain(int argc, _TCHAR* argv[])
{
	srand(time(0));

	int size=rand()%20;
	Node* head=NULL;
	for(int i=0;i<size;++i)
		addHead(rand()%50,head);

	print(head);
	print(mergeSort(head));

	getchar();
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值