题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
思路:用pNode1遍历链表1,用pNode2遍历链表2,循环只有两个链表都遍历完才结束,
即终止条件:pNode1 == nullptr || pNode2 == nullptr
所以有三种情况:
1、pNode1 == nullptr || pNode2 != nullptr
2、pNode1 != nullptr || pNode2 == nullptr
3、pNode1 != nullptr || pNode2 != nullptr
1、2情况是某条链表遍历完成,只需将未遍历完的链表的节点一次加入返回的链表中
3中两链表均为遍历完,需要将两链表的头节点进行比较,将较小的加入结果链表
尝试过将13、23合并:
pNode1 == nullptr || pNode1->val > pNode2->val
如果左边不成立,即pNode1 != nullptr,则pNode2可能为nullptr,这时pNode2->val会出错
方法二:递归,参考《剑指offer》
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
if(pHead1 == nullptr && pHead2 == nullptr)
return nullptr;
ListNode* pNode1 = pHead1;
ListNode* pNode2 = pHead2;
//头节点
ListNode* pRet = new ListNode(0);
ListNode* pNode3 = pRet;
while(pNode1 != nullptr || pNode2 != nullptr){
if(pNode1 == nullptr){
pNode3->next = pNode2;
pNode3 = pNode3->next;
pNode2 = pNode2->next;
}
else if(pNode2 == nullptr){
pNode3->next = pNode1;
pNode3 = pNode3->next;
pNode1 = pNode1->next;
}
else{
if(pNode1->val > pNode2->val){
pNode3->next = pNode2;
pNode3 = pNode3->next;
pNode2 = pNode2->next;
}
else{
pNode3->next = pNode1;
pNode3 = pNode3->next;
pNode1 = pNode1->next;
}
}
}
return pRet->next;
}
};