Linklist Merge Sort(微软等面试一百题-链表排序)代码

39 篇文章 0 订阅

因为自己写程序栽在这个问题上了,所以就手写+机试的敲了一下,虽然很小心,但是机试的时候依然写出了bug,所以发这篇帖子算是让自己长长记性吧。

问题如下:

1.编写实现链表排序的一种算法。说明为什么你会选择用这样的方法

代码如下:

#include <stdio.h>
#include <stdlib.h>

struct LinkNode
{
	int data;
	LinkNode *pNext;

	LinkNode(int _data)
	{
		data = _data;
		pNext = NULL;
	}
};

LinkNode* MergeLink(LinkNode *pLeftLink, LinkNode *pRightLink)
{
	LinkNode *ph = NULL, *p = NULL;

	while (pLeftLink && pRightLink)
	{
		if(pLeftLink->data < pRightLink->data)
		{
			if(ph == NULL)
			{
				ph = p = pLeftLink;
				pLeftLink = pLeftLink->pNext;
			}
			else
			{
				p->pNext = pLeftLink;
				p = p->pNext;
				pLeftLink = pLeftLink->pNext;
			}

		}
		else
		{
			
			if(ph == NULL)
			{
				ph = p = pRightLink;
				pRightLink = pRightLink->pNext;
			}
			else
			{
				p->pNext = pRightLink;
				p = p->pNext;
				pRightLink = pRightLink->pNext;
			}
		}
	}
	
	p->pNext = (pLeftLink == NULL) ? pRightLink : pLeftLink;

	return ph;
}

LinkNode *MergeSort(LinkNode *pHead, int len)
{
	if(len == 1)
	{
		pHead->pNext = NULL;
		return pHead;
	}

	//当时这里就写出了bug,我是先运算了MergeSort(pHead, len/2),然后用那个phead来求pRightStart
	LinkNode *pRightStart = pHead;
	for(int i = 0;i < len / 2; i++)
	{
		pRightStart = pRightStart->pNext;
	}

	LinkNode *pLeftHalf = MergeSort(pHead, len/2);
	LinkNode *pRightHalf = MergeSort(pRightStart, len - len/2);

	LinkNode *pMergedLink = MergeLink(pLeftHalf, pRightHalf);
	return pMergedLink;

}
void PrintAll(LinkNode *pHead)
{
	int i = 1;
	while(pHead)
	{
		printf("%d ", pHead->data);
		pHead = pHead->pNext;

		if(i++ % 20 == 0)
		{
			printf("\n");
		}

	}
}
int main()
{
	LinkNode *pHead = NULL;
	LinkNode *pCurrent = NULL;

	int flags[300] = {0};
	for(int i = 0; i < 10; )
	{
		int num = rand()%300;
		if(flags[num])
		{
			continue;
		}
		else
		{
			flags[i] = 1;
			i++;

			LinkNode *pNewNode = new LinkNode(num);
			if(pHead == NULL)
			{
				pHead = pCurrent = pNewNode;
			}
			else
			{
				pCurrent->pNext = pNewNode;
				pCurrent = pCurrent->pNext;
			}
		}
		
	}

	PrintAll(pHead);
	printf("\n\n\n");
	pHead = MergeSort(pHead, 10);
	PrintAll(pHead);



	return 0;
}


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值