合并两个排序的链表

  题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。
  例:链表一: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;

}

猜你喜欢

转载自my.oschina.net/134596/blog/1796075