题目描述:
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
测试用例:
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;
}
};