25 合并两个排序的链表(第3章 高质量的代码-代码的鲁棒性)

Posted GuoXinxin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
    }
};

  

  

  

以上是关于25 合并两个排序的链表(第3章 高质量的代码-代码的鲁棒性)的主要内容,如果未能解决你的问题,请参考以下文章

剑指 Offer 25. 合并两个排序的链表

最佳解法剑指 Offer 25. 合并两个排序的链表

最佳解法剑指 Offer 25. 合并两个排序的链表

算法剑指 Offer 25. 合并两个排序的链表

leetcode-剑指 Offer 25合并两个排序的链表

剑指offer-面试题25-合并两个排序的链表-链表