本文使用两种方法实现两个排序链表的合并,一种是递归法,一种是循环法,其中循环法又用了两种方法,一个使用了队列,一个正常思路。代码中你会发现有释放内存的函数,但在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;
}