zoukankan      html  css  js  c++  java
  • 25 合并两个排序的链表(第3章 高质量的代码-代码的鲁棒性)

    题目描述:

    输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则

    测试用例:  

     1)功能测试(输入的两个链表有多个节点;节点的值互不相同或者存在值相等的多个节点)

     2)特殊输入测试(连个链表的一个或者两个头节点为nullptr指针;两个链表中只有一个节点为什么单独列出来,哪里特殊??

    解题思路:

    1)将两个链表的值按大小存入到队列queue中,然后按照队列的值重新生成一个新的链表。

    class Solution {
    public:
        ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
        {
            //处理特殊输入
            if(pHead1==nullptr)return pHead2;
            if(pHead2==nullptr)return pHead1;
            //为每个链表定义一个访问指针
            ListNode* pCurrent1=pHead1;
            ListNode* pCurrent2=pHead2;
            //新链表的头节点
            ListNode* newpHead=new ListNode(-1);  
            //定义队列用于存储链表的所有节点的值(排序好的)
            queue<int> saveValues;
            
            while( pCurrent1!=nullptr && pCurrent2!=nullptr){
                if(pCurrent1->val <= pCurrent2->val){
                    saveValues.push(pCurrent1->val);
                    pCurrent1 = pCurrent1->next;
                }else{
                    saveValues.push(pCurrent2->val);
                    pCurrent2 = pCurrent2->next;
                }
            }
            //将剩余链表的值直接读入
            ListNode* nullFlag = nullptr;
            if(pCurrent1==nullptr)
                nullFlag = pCurrent2;
            else
                nullFlag = pCurrent1;
            
            while(nullFlag != nullptr){
                saveValues.push(nullFlag->val);
                nullFlag = nullFlag->next;
            }
            //建立新的链表
            ListNode* pNode = newpHead;
            while(!saveValues.empty()){
                ListNode* pnewNode=new ListNode(-1);
                pnewNode->val=saveValues.front();
                saveValues.pop();
                pNode->next = pnewNode;
                pNode = pNode->next;
            }
            
            return newpHead->next;
        }
    };
    

    2)使用递归方法:

    //实现1
    class Solution { public: ListNode* Merge(ListNode* pHead1, ListNode* pHead2) { if(pHead1==nullptr)return pHead2; if(pHead2==nullptr)return pHead1; if(pHead1->val <= pHead2->val){ //则头节点为pHead1 pHead1->next = Merge(pHead1->next, pHead2); return pHead1; }else{ //则头节点为pHead2 pHead2->next = Merge(pHead1, pHead2->next); return pHead2; } } };
    //实现2
    class Solution {
    public:
        ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
        {
            if(pHead1==nullptr)return pHead2;
            if(pHead2==nullptr)return pHead1;
            
            ListNode* pMergedHead = nullptr;
    
            if(pHead1->val <= pHead2->val){ //则头节点为pHead1
                pMergedHead = pHead1;
                pMergedHead->next = Merge(pHead1->next, pHead2);
            }else{
                pMergedHead = pHead2;
                pMergedHead->next = Merge(pHead1, pHead2->next);
            }
            return pMergedHead;
        }
    };
    

      

      

      

  • 相关阅读:
    UVA 10617 Again Palindrome
    UVA 10154 Weights and Measures
    UVA 10201 Adventures in Moving Part IV
    UVA 10313 Pay the Price
    UVA 10271 Chopsticks
    Restore DB後設置指引 for maximo
    每行SQL語句加go換行
    种服务器角色所拥有的权限
    Framework X support IPV6?
    模擬DeadLock
  • 原文地址:https://www.cnblogs.com/GuoXinxin/p/10449521.html
Copyright © 2011-2022 走看看