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章 高质量的代码-代码的鲁棒性)的主要内容,如果未能解决你的问题,请参考以下文章