剑指offer JZ-16

题目描述

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
示例1

输入

复制
{1,3,5},{2,4,6}

返回值

复制
{1,2,3,4,5,6}

思路

1.非递归:

  申请新的空间用于存放合并后的链表;

  若当前pHead1的val值不大于pHead2的val值,则将pHead1放入新链表中,并将pHead1后移一位;

  若当前pHead2的val值不大于pHead1的val值,则将pHead2放入新链表中,并将pHead2后移一位;

  若某一指针为空,且另一指针非空,则将非空指针加入新链表

  这样的时间复杂度为O(n+m),空间复杂度为O(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 NULL;
        ListNode* p = new ListNode(0);
        ListNode* ans = p;
        while(pHead1 && pHead2)
        {
            if(pHead1->val <= pHead2->val)
            {
                p->next = pHead1;
                pHead1 = pHead1->next;
                p = p->next;
            }
            else
            {
                p->next = pHead2;
                pHead2 = pHead2->next;
                p = p->next;
            }
        }
        p->next = pHead1?pHead1:pHead2;
        return ans->next;
    }
};
View Code

2.递归

  没啥好说的,代码简单明了.时间复杂度为O(n+m),同时因为递归会调用栈的缘故空间复杂度为O(n+m)

/*
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;
        else if(pHead2==NULL) return pHead1;
        ListNode* p = new ListNode(0);
        if(pHead1->val <= pHead2->val)
        {
            p = pHead1;
            p->next = Merge(pHead1->next, pHead2);
        }
        else
        {
            p = pHead2;
            p->next = Merge(pHead1, pHead2->next);
        }
        return p;
    }
};
View Code

 

  没啥好说的,代码简洁

posted @ 2021-01-05 22:08  声声醉如兰  阅读(124)  评论(0编辑  收藏  举报