/******************************************************************
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然
是按照递增排序的。
******************************************************************/
#include<stdio.h>
struct ListNode
{
int m_nValue;
ListNode* m_pNext;
};
ListNode* createListNode(int value)
{
ListNode* pNode = new ListNode();
pNode->m_nValue = value;
pNode->m_pNext = NULL;
return pNode;
}
void connectListNode(ListNode* pListNode1, ListNode* pListNode2)
{
if(pListNode2 == NULL || pListNode2 == NULL)
return;
pListNode1->m_pNext = pListNode2;
}
ListNode* mergeSortedLists(ListNode* pList1, ListNode* pList2)
{
if(!pList1)
return pList2;
if(!pList2)
return pList1;
ListNode* pHead;
if(pList1->m_nValue <= pList2->m_nValue)
{
pHead = pList1;
pHead->m_pNext = mergeSortedLists(pList1->m_pNext,pList2);
}
if(pList1->m_nValue > pList2->m_nValue)
{
pHead = pList2;
pHead->m_pNext = mergeSortedLists(pList1,pList2->m_pNext);
}
return pHead;
}
void printList(ListNode* pNode)
{
if(pNode == NULL)
printf("List is NULL");
while(pNode)
{
printf("%d\t",pNode->m_nValue);
pNode = pNode->m_pNext;
}
printf("\n");
}
//单元测试
//两个非空链表
void test1()
{
ListNode* pList1_Node1 = createListNode(1);
ListNode* pList1_Node2 = createListNode(3);
ListNode* pList1_Node3 = createListNode(5);
ListNode* pList1_Node4 = createListNode(7);
connectListNode(pList1_Node1,pList1_Node2);
connectListNode(pList1_Node2,pList1_Node3);
connectListNode(pList1_Node3,pList1_Node4);
printList(pList1_Node1);
ListNode* pList2_Node1 = createListNode(2);
ListNode* pList2_Node2 = createListNode(4);
ListNode* pList2_Node3 = createListNode(6);
ListNode* pList2_Node4 = createListNode(8);
connectListNode(pList2_Node1,pList2_Node2);
connectListNode(pList2_Node2,pList2_Node3);
connectListNode(pList2_Node3,pList2_Node4);
printList(pList2_Node1);
ListNode* pHead = mergeSortedLists(pList1_Node1,pList2_Node1);
printList(pHead);
}
//一个空链表另一个非空
void test2()
{
ListNode* pList1_Node1 = createListNode(1);
ListNode* pList1_Node2 = createListNode(3);
ListNode* pList1_Node3 = createListNode(5);
ListNode* pList1_Node4 = createListNode(7);
connectListNode(pList1_Node1,pList1_Node2);
connectListNode(pList1_Node2,pList1_Node3);
connectListNode(pList1_Node3,pList1_Node4);
printList(pList1_Node1);
ListNode* pHead = mergeSortedLists(pList1_Node1,NULL);
printList(pHead);
}
//两个非空链表
void test3()
{
ListNode* pHead = mergeSortedLists(NULL,NULL);
printList(pHead);
}
int main()
{
test1();
test2();
test3();
return 0;
}
非递归实现
ListNode* Merge(ListNode* pListNode1, ListNode* pListNode2)
{
if(!pListNode1)
return pListNode2;
if(!pListNode2)
return pListNode1;
ListNode* pHead = NULL;
ListNode* pNode = NULL;
while(pListNode1 != NULL && pListNode2 != NULL)
{
if(pListNode1->m_nValue > pListNode2->m_nValue)
{
if(pHead == NULL)
{
pHead = pListNode2;
pNode = pListNode2;
}
else
{
pNode->m_pNext = pListNode2;
pNode = pNode->m_pNext;
}
pListNode2 = pListNode2->m_pNext;
}
else
{
if(pHead == NULL)
{
pHead = pListNode1;
pNode = pListNode1;
}
else
{
pNode->m_pNext = pListNode1;
pNode = pNode->m_pNext;
}
pListNode1 = pListNode1->m_pNext;
}
}
if(pListNode1 != NULL)
{
pNode->m_pNext = pListNode1;
}
if(pListNode2 != NULL)
{
pNode->m_pNext = pListNode2;
}
return pHead;
}
==参考剑指OFFER