合并两个排序的链表

1.递归求解

/*
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;  
        if(pHead1==nullptr)
        return pHead2;
        if(pHead2==nullptr)
        return pHead1;
        
        //开始递归求   //要定义一个辅助的量  将排好序的放在里面
        ListNode* pMergehead=nullptr;//归并后的
       if(pHead1->val<=pHead2->val) 
        {
           pMergehead=pHead1; 
           pMergehead->next= Merge(pHead1->next,pHead2);//递归一般都于高向低 内部
        }
        else {
            pMergehead=pHead2;
            pMergehead->next= Merge(pHead1,pHead2->next);
        }
   
    return  pMergehead;
    }
};

2. 非递归    注意顺序 将==NULL放在最后,  满足的也是一开始就进去了!!!

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};*/
class Solution {
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2)//两个链表长度不一样
    {

  //新建一个头节点,用来存合并的链表。
        ListNode * head=new ListNode(-1);
        head->next=NULL;
        ListNode * root=head;
        while(pHead1!=NULL&&pHead2!=NULL){//都不为null
            if(pHead1->val<pHead2->val){
                head->next=pHead1;
                head=head->next;
                pHead1=pHead1->next;
            }else{
                head->next=pHead2;
                head=head->next;
                pHead2=pHead2->next;
            }
        }
        //把未结束的链表连接到合并后的链表尾部
        if(pHead1!=NULL){
            head->next=pHead1;
        }
        if(pHead2!=NULL){
            head->next=pHead2;
        }
        return root->next;
    }
};

 

posted @ 2019-08-20 20:59  高颖1995  阅读(155)  评论(0编辑  收藏  举报