1. 程式人生 > >面試雜題(八)合併兩個遞增連結串列

面試雜題(八)合併兩個遞增連結串列

#include <iostream>
typedef struct LinklistNode 
{	

	int nData;
	struct LinklistNode *next;
}Node;
using namespace std;
#define N 20
Node *mergeLinkList(Node *pHead1,Node *pHead2);
Node* createLinkList(int *pData,int nLen);
void  printLinkList(Node *pHead);
int main()
{
	int nData1[N];
	int nData2[N];
	for(int i=0;i<N;i++)
	{
		nData1[i]=2*i+1;
	}
	for(int i=0;i<N;i++)
	{
		nData2[i]=2*i+2;
	}

	Node *pHead1=createLinkList(nData1,N);
	Node *pHead2=createLinkList(nData2,N);
	printLinkList(pHead1);
	printLinkList(pHead2);
	
	Node *pHeadNew=mergeLinkList(pHead1,pHead2);
	printLinkList(pHeadNew);


	getchar();
	return 0;
}


Node* createLinkList(int *pData,int nLen)
{
	if (pData==NULL||nLen<=0)
	{
		return NULL;
	}
	Node *pHead=new Node;
	Node *pTemp=pHead;
	for (int i=0;i<nLen;i++)
	{
		if (i==nLen-1)
		{
			pTemp->nData=pData[i];
			pTemp->next=NULL;
			return pHead;
		}
		pTemp->nData=pData[i];
		pTemp->next=new Node;
		pTemp=pTemp->next;
		
	}
}

void  printLinkList(Node *pHead)
{
	Node *pTemp=pHead;
	while(pTemp!=NULL)
	{
		cout<<pTemp->nData<<'\t';
		pTemp=pTemp->next;
	}
	cout<<endl;
}



Node *mergeLinkList(Node *pHead1,Node *pHead2)
{
	Node *pTemp1=pHead1;
	Node *pTemp2=pHead2;
	
	if (pTemp2==NULL||pTemp1==NULL)
	{
		if (pTemp1)
		{
			return pTemp1;
		}
		if (pTemp2)
		{
			return pTemp2;
		}
		return NULL;
	}
	
	Node *pHeadNew=NULL;
	if (pHead1->nData<=pHead2->nData)
	{
		pHeadNew=pHead1;
		pTemp1=pTemp1->next;
	}
	else
	{
		pHeadNew=pHead2;
		pTemp2=pTemp2->next;
	}
	Node *pTemp=pHeadNew;
	
	while(pTemp2!=NULL&&pTemp1!=NULL)
	{
		if (pTemp1->nData<=pTemp2->nData)
		{
			pTemp->next=pTemp1;
			pTemp1=pTemp1->next;
			pTemp=pTemp->next;
		}
		else
		{
			pTemp->next=pTemp2;
			pTemp2=pTemp2->next;
			pTemp=pTemp->next;
		}
	}
		if (pTemp1)
		{
			pTemp->next=pTemp1;
		}

		if (pTemp2)
		{
			pTemp->next=pTemp2;
		}
	return pHeadNew;
}