输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
非递归方法:
思路:
1.pHead1与pHead2非空,若其中有一个是空的,则返回另一个。
2.两个链表非空时,创建一个新的链表头结点ans和一个临时的结点p,p代表最新加入的结点,先比较头结点,小的成为新链表的头结点。
3.继续比较pHead1与pHead2,p的next指向较小的,然后小的链表往后移,同时p也往后移。
4.当有其中一个合成完了,成为NULL时,另一个链表直接加到p的后面。
程序如下:
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
ListNode *ans,*p;
ans=p=NULL;
if(pHead1==NULL)return pHead2;
if(pHead2==NULL)return pHead1;
while(pHead1!=NULL&&pHead2!=NULL)
{
if(pHead1->val <= pHead2->val)
{
if(ans==NULL){
p=ans=pHead1;
}else{
p->next=pHead1;
p=p->next;
}
pHead1=pHead1->next;
}
else
{
if(ans==NULL)
{
p=ans=pHead2;
}else
{
p->next=pHead2;
p=p->next;
}
pHead2=pHead2->next;
}
}
if(pHead1==NULL)p->next=pHead2;
if(pHead2==NULL)p->next=pHead1;
return ans;
}
};
递归方法
每次Merge出来是当前结点的next,一定要想清楚
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
ListNode *ans=NULL;
if(pHead1==NULL)return pHead2;
if(pHead2==NULL)return pHead1;
if(pHead1->val <= pHead2->val)
{
ans=pHead1;
ans->next=Merge(pHead1->next,pHead2);
}
else
{
ans=pHead2;
ans->next=Merge(pHead1,pHead2->next);
}
return ans;
}
};