题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
/*
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)
{
return pHead2;
}
if(pHead2==nullptr)
{
return pHead1;
}
ListNode* res=nullptr;
if(pHead1->val>=pHead2->val)
{
res=pHead2;
res->next=Merge(pHead1,pHead2->next);
}
else
{
res=pHead1;
res->next=Merge(pHead1->next,pHead2);
}
return res;
}
};
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
ListNode *p=new ListNode(0);
*q=p;//两个指针都指向合成后新链表头节点,p用来做插入,q用来保存头结点地址
if(!pHead1)
return pHead2;
if(!pHead2)
return pHead1; //若有某一个链表为空,则返回另一个
while(1)
{
if(pHead1->val<pHead2->val)
{
p->val=pHead1->val; //如果L1值小,则L1向下走
pHead1=pHead1->next;
}
else
{
p->val=pHead2->val; //如果L2值小,则L2向下走
pHead2=pHead2->next;
}
if(pHead1==NULL||pHead2==NULL) //若某个链表走完,则跳出
break;
p->next=new ListNode(0); //不断增加合成后链表的节点
p=p->next;
}
if(!pHead1)
p->next=pHead2;
if(!pHead2)
p->next=pHead1; //若某个链表走完,则将另一个链表续在合成后链表的末尾
return q;
}
};