题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。
例:链表一:1 -> 3 -> 5 -> 7 链表二:2 -> 4 -> 6 -> 8 合并后:1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8
思路:先判断两个链表是否是空,如果是则直接返回另一个链表。若都不为空,则从两个链表的第一个结点开始进行比较,将小的取出来,然后移到下一个结点继续递归操作。
测试用例:
1.功能测试
2.特殊测试:NULL、一个结点
#include<cstdio>
#include<iostream>
using namespace std;
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 ConnectListNodes(ListNode* pCurrent, ListNode* pNext)
{
if (pCurrent == NULL)
{
cout << "连接错误" << endl;
return;
}
pCurrent->m_pNext = pNext;
}
//打印链表
void PrintList(ListNode* pHead)
{
ListNode* pNode = pHead;
while (pNode != NULL)
{
cout << pNode->m_nValue << " ";
pNode = pNode->m_pNext;
}
cout << endl;
}
//销毁链表
void DestroyList(ListNode* pHead)
{
ListNode* pNode = pHead;
while (pNode != NULL)
{
pHead = pHead->m_pNext;
delete pNode;
pNode = pHead;;
}
}
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
if (pHead1 == NULL)
{
return pHead2;
}
else if (pHead2 == NULL)
{
return pHead1;
}
ListNode* pMergedHead = NULL;
if (pHead1->m_nValue < pHead2->m_nValue)
{
pMergedHead = pHead1;
pMergedHead->m_pNext = Merge(pHead1->m_pNext, pHead2);
}
else
{
pMergedHead = pHead2;
pMergedHead->m_pNext = Merge(pHead1, pHead2->m_pNext);
}
return pMergedHead;
}
void Test1()
{
ListNode* node1 = CreateListNode(1);
ListNode* node2 = CreateListNode(3);
ListNode* node3 = CreateListNode(5);
ListNode* node4 = CreateListNode(7);
ListNode* node5 = CreateListNode(9);
ListNode* node6 = CreateListNode(2);
ListNode* node7 = CreateListNode(4);
ListNode* node8 = CreateListNode(6);
ListNode* node9 = CreateListNode(8);
ListNode* node0 = CreateListNode(10);
ConnectListNodes(node1, node2);
ConnectListNodes(node2, node3);
ConnectListNodes(node3, node4);
ConnectListNodes(node4, node5);
ConnectListNodes(node6, node7);
ConnectListNodes(node7, node8);
ConnectListNodes(node8, node9);
ConnectListNodes(node9, node0);
PrintList(node1);
PrintList(node6);
ListNode* pHead = Merge(node1, node6);
PrintList(pHead);
DestroyList(pHead);
}
void Test2()
{
ListNode* node1 = CreateListNode(1);
ListNode* node2 = CreateListNode(3);
ListNode* node3 = CreateListNode(5);
ListNode* node4 = CreateListNode(7);
ListNode* node5 = CreateListNode(9);
PrintList(node1);
ListNode* pHead = Merge(node1, NULL);
PrintList(pHead);
DestroyList(pHead);
}
void Test3()
{
ListNode* pHead = Merge(NULL, NULL);
DestroyList(pHead);
}
int main()
{
Test1();
Test2();
Test3();
return 0;
}