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;
        }
    };
    

      

      

      

  • 相关阅读:
    安卓AlertDialog的使用
    蚂蚁的腿
    年龄排序
    Digital Roots
    小明的存钱计划
    不高兴的小明
    管闲事的小明
    小明的调查作业
    爱摘苹果的小明
    小明的难题
  • 原文地址:https://www.cnblogs.com/GuoXinxin/p/10449521.html
Copyright © 2011-2022 走看看