25剑指OFFER之合并两个排序的链表

参考资料:

[1]剑指OFFER课本 P145

关键词:

合并两个有序数列、插入新的节点、返回头节点、图解说明

图解说明:


25剑指OFFER之合并两个排序的链表_第1张图片
merge.png
自己的答案:
/*
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;
        else if(pHead2 == nullptr) 
            return pHead1;
        
        //思路可以参考:合并两个有序的序列
        ListNode* MergeList = nullptr;
        ListNode* MergeListHead = nullptr;
        ListNode* pNode1 =pHead1;
        ListNode* pNode2 =pHead2;
        //步骤1:确定头节点
        if(pNode1->val < pNode2->val)
        {
            MergeList = pNode1;
            MergeListHead = MergeList;
            pNode1 = pNode1->next;
        }    
        else
        {
            MergeList = pNode2;
            MergeListHead = MergeList;
            pNode2 = pNode2->next;
        }
        //步骤2:两个非空就这样
        while((pNode1 != nullptr) && (pNode2 != nullptr))
        {
            if(pNode1->val <=pNode2->val)
            {
                MergeList->next = pNode1;//这个涉及到如何添加节点的问题
                MergeList = MergeList->next;
                pNode1 = pNode1->next;
            }
            else
            {
                MergeList->next = pNode2;
                MergeList = MergeList->next;
                pNode2 = pNode2->next;
            }
        }
        //步骤3:只要其中一个空了,就只弄其中一种
        while(pNode1 != nullptr)
        {
            MergeList->next = pNode1;
            MergeList = MergeList->next;
            pNode1 = pNode1->next;
        }
        while(pNode2 != nullptr)
        {
            MergeList->next = pNode2;
            MergeList = MergeList->next;
            pNode2 = pNode2->next;
        }
        return MergeListHead;//返回头节点
    }
};
下面这个答案更好。
标准答案:
/*
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* pMergeList;
        
        //1.如果链表1的头结点的值小于链表2的头结点的值,那么链表1的头结点为合并后的头节点
        if(pHead1->val <= pHead2->val)
        {
            pMergeList = pHead1;
            pMergeList->next = Merge(pHead1->next,pHead2); 
        }
        else if(pHead1->val > pHead2->val)
        {
            pMergeList = pHead2;
            pMergeList->next = Merge(pHead1,pHead2->next);
        }
        //如果相等,怎么办?放在其中一个情况中即可
       return pMergeList;
    }
};

合并K个排序的链表

你可能感兴趣的:(25剑指OFFER之合并两个排序的链表)