• 《剑指offer》第二十五题:合并两个排序的链表


    // 面试题25:合并两个排序的链表
    // 题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按
    // 照递增排序的。例如输入图3.11中的链表1和链表2,则合并之后的升序链表如链
    // 表3所示。
    
    #include <cstdio>
    #include "List.h"
    
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
    {
        if (pHead1 == nullptr)
            return pHead2;
        else if (pHead2 == nullptr)
            return pHead1;
    
        ListNode* pNewHead = nullptr;
    
        if (pHead1->m_nValue < pHead2->m_nValue)
        {
            pNewHead = pHead1;
            pNewHead->m_pNext = Merge(pHead1->m_pNext, pHead2);
        }
        else
        {
            pNewHead = pHead2;
            pNewHead->m_pNext = Merge(pHead1, pHead2->m_pNext);
        }
        return pNewHead;
    }
    // ====================测试代码====================
    ListNode* Test(const char* testName, ListNode* pHead1, ListNode* pHead2)
    {
        if (testName != nullptr)
            printf("%s begins:
    ", testName);
    
        printf("The first list is:
    ");
        PrintList(pHead1);
    
        printf("The second list is:
    ");
        PrintList(pHead2);
    
        printf("The merged list is:
    ");
        ListNode* pMergedHead = Merge(pHead1, pHead2);
        PrintList(pMergedHead);
    
        printf("
    
    ");
    
        return pMergedHead;
    }
    
    // list1: 1->3->5
    // list2: 2->4->6
    void Test1()
    {
        ListNode* pNode1 = CreateListNode(1);
        ListNode* pNode3 = CreateListNode(3);
        ListNode* pNode5 = CreateListNode(5);
    
        ConnectListNodes(pNode1, pNode3);
        ConnectListNodes(pNode3, pNode5);
    
        ListNode* pNode2 = CreateListNode(2);
        ListNode* pNode4 = CreateListNode(4);
        ListNode* pNode6 = CreateListNode(6);
    
        ConnectListNodes(pNode2, pNode4);
        ConnectListNodes(pNode4, pNode6);
    
        ListNode* pMergedHead = Test("Test1", pNode1, pNode2);
    
        DestroyList(pMergedHead);
    }
    
    // 两个链表中有重复的数字
    // list1: 1->3->5
    // list2: 1->3->5
    void Test2()
    {
        ListNode* pNode1 = CreateListNode(1);
        ListNode* pNode3 = CreateListNode(3);
        ListNode* pNode5 = CreateListNode(5);
    
        ConnectListNodes(pNode1, pNode3);
        ConnectListNodes(pNode3, pNode5);
    
        ListNode* pNode2 = CreateListNode(1);
        ListNode* pNode4 = CreateListNode(3);
        ListNode* pNode6 = CreateListNode(5);
    
        ConnectListNodes(pNode2, pNode4);
        ConnectListNodes(pNode4, pNode6);
    
        ListNode* pMergedHead = Test("Test2", pNode1, pNode2);
    
        DestroyList(pMergedHead);
    }
    
    // 两个链表都只有一个数字
    // list1: 1
    // list2: 2
    void Test3()
    {
        ListNode* pNode1 = CreateListNode(1);
        ListNode* pNode2 = CreateListNode(2);
    
        ListNode* pMergedHead = Test("Test3", pNode1, pNode2);
    
        DestroyList(pMergedHead);
    }
    
    // 一个链表为空链表
    // list1: 1->3->5
    // list2: 空链表
    void Test4()
    {
        ListNode* pNode1 = CreateListNode(1);
        ListNode* pNode3 = CreateListNode(3);
        ListNode* pNode5 = CreateListNode(5);
    
        ConnectListNodes(pNode1, pNode3);
        ConnectListNodes(pNode3, pNode5);
    
        ListNode* pMergedHead = Test("Test4", pNode1, nullptr);
    
        DestroyList(pMergedHead);
    }
    
    // 两个链表都为空链表
    // list1: 空链表
    // list2: 空链表
    void Test5()
    {
        ListNode* pMergedHead = Test("Test5", nullptr, nullptr);
    }
    
    int main(int argc, char* argv[])
    {
        Test1();
        Test2();
        Test3();
        Test4();
        Test5();
    
        return 0;
    }
    测试代码

    分析:递归简洁之美。

    /*
    struct ListNode {
        int val;
        struct ListNode *next;
        ListNode(int x) :
                val(x), next(NULL) {
        }
    };*/
    class Solution {
    public:
        ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
        {
            if (pHead1 == nullptr)
                return pHead2;
            else if (pHead2 == nullptr)
                return pHead1;
            
            ListNode* pMergeHead = nullptr;
            
            if (pHead1->val < pHead2->val)
            {
                pMergeHead = pHead1;
                pMergeHead->next = Merge(pHead1->next, pHead2);
            }
            else
            {
                pMergeHead = pHead2;
                pMergeHead->next = Merge(pHead1, pHead2->next);
            }
            return pMergeHead;
        }
    };
    牛客网提交代码
  • 相关阅读:
    Jenkins的多个任务并串联参数传递
    jenkins任务构建失败重试插件Naginator Plugin
    通过hive向写elasticsearch的写如数据
    Elasticsearch中的索引管理和搜索常用命令总结
    Elasticsearch安装
    运行 Spark on YARN
    Jenkins console输出乱码???
    spark的standlone模式安装和application 提交
    多种排序算法整理
    结构型模式(二)
  • 原文地址:https://www.cnblogs.com/ZSY-blog/p/12579998.html
Copyright © 2020-2023  润新知