分析:其实就是mergesort里面的merge,不过换成链表了。这里考虑非递归和递归两种方法
1、非递归
如果某一个链表为空,直接返回另一个链表;
如果当前结果链表为空,则将两个链表指针对应比较小的那个直接赋值给结果链表;
如果当前结果老板不为空,则将当前指针的next指向两个链表指针对应比较小的那个;
最后一个链表遍历结束了,直接把另一个链表的当前指针加到结果链表后面。
/*
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==NULL) return pHead2;
if(pHead2==NULL) return pHead1;
ListNode* n,*ret=NULL;
ListNode* p=pHead1;
ListNode* q=pHead2;
while(p!=NULL&&q!=NULL){
if(p->val<=q->val){
if(ret==NULL){
ret=n=p;
}else{
n->next=p;
n=n->next;
}
p=p->next;
}
else{
if(ret==NULL){
ret=n=q;
}else{
n->next=q;
n=n->next;
}
q=q->next;
}
}
if(p!=NULL){
n->next=p;
}
if(q!=NULL){
n->next=q;
}
return ret;
}
};
2、非递归
/*
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==NULL) return pHead2;
if(pHead2==NULL) return pHead1;
ListNode* ret=NULL;
if(pHead1->val<=pHead2->val){
ret=pHead1;
ret->next=Merge(pHead1->next,pHead2);
}
else{
ret=pHead2;
ret->next=Merge(pHead1,pHead2->next);
}
return ret;
}
};