/*******************************************************************
Copyright(c) 2016, Tyrone Li
All rights reserved.
*******************************************************************/
// 作者:TyroneLi
//
/*
Q:
合并两个有序链表:
输入两个递增排序的链表,合并这两个链表使得
新链表也是按照递增排序的。
S:
利用递归方法不断链接两个升序链表中的较小值结点,直到两个链表完全合并
*/
#include "../utils/List.h"
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
ListNode*mergeOrderedLists(ListNode*listA, ListNode*listB)
{
if(listB == nullptr)
return listA;
if(listA == nullptr)
return listB;
ListNode*pMerge = nullptr;
if(listA->m_nValue < listB->m_nValue)
{
pMerge = listA;
pMerge->m_pNext = mergeOrderedLists(listA->m_pNext, listB);
}else{
pMerge = listB;
pMerge->m_pNext = mergeOrderedLists(listA, listB->m_pNext);
}
return pMerge;
}
void test_1()
{
std::cout << "test 1 : multi nodes in list" << std::endl;
ListNode*pHead = createListNode(1);
addToTail(&pHead, 3);
addToTail(&pHead, 5);
addToTail(&pHead, 7);
printList(pHead);
ListNode*pHead2 = createListNode(2);
addToTail(&pHead2, 4);
addToTail(&pHead2, 6);
printList(pHead2);
ListNode*mergeHead = mergeOrderedLists(pHead, pHead2);
printList(mergeHead);
std::cout << std::endl;
destroyList(mergeHead);
}
void test_2()
{
std::cout << "test 2 : multi nodes and repeat values in list" << std::endl;
ListNode*pHead = createListNode(1);
addToTail(&pHead, 3);
addToTail(&pHead, 5);
addToTail(&pHead, 7);
printList(pHead);
ListNode*pHead2 = createListNode(2);
addToTail(&pHead2, 4);
addToTail(&pHead2, 6);
addToTail(&pHead2, 8);
addToTail(&pHead2, 8);
addToTail(&pHead2, 8);
addToTail(&pHead2, 10);
addToTail(&pHead2, 10);
printList(pHead2);
ListNode*mergeHead = mergeOrderedLists(pHead, pHead2);
printList(mergeHead);
std::cout << std::endl;
destroyList(mergeHead);
}
void test_3()
{
std::cout << "test 3 : multi nodes list and single node list" << std::endl;
ListNode*pHead = createListNode(1);
printList(pHead);
ListNode*pHead2 = createListNode(2);
addToTail(&pHead2, 4);
addToTail(&pHead2, 6);
addToTail(&pHead2, 8);
printList(pHead2);
ListNode*mergeHead = mergeOrderedLists(pHead, pHead2);
printList(mergeHead);
std::cout << std::endl;
destroyList(mergeHead);
}
void test_4()
{
std::cout << "test 4 : multi nodes list and single node list" << std::endl;
ListNode*pHead = createListNode(1);
addToTail(&pHead, 3);
addToTail(&pHead, 5);
addToTail(&pHead, 7);
printList(pHead);
ListNode*pHead2 = createListNode(2);
printList(pHead2);
ListNode*mergeHead = mergeOrderedLists(pHead, pHead2);
printList(mergeHead);
std::cout << std::endl;
destroyList(mergeHead);
}
void test_5()
{
std::cout << "test 4 : NULL lists" << std::endl;
ListNode*pHead = nullptr;
printList(pHead);
ListNode*pHead2 = nullptr;
ListNode*mergeHead = mergeOrderedLists(pHead, pHead2);
printList(mergeHead);
std::cout << std::endl;
destroyList(mergeHead);
}
void test_mergeOrderedLists()
{
test_1();
test_2();
test_3();
test_4();
test_5();
}
int main(int argc, char**argv)
{
test_mergeOrderedLists();
return 0;
}