《LeetCode之每日一题》:137.合并两个有序链表

Posted 是七喜呀!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《LeetCode之每日一题》:137.合并两个有序链表相关的知识,希望对你有一定的参考价值。

合并两个有序链表


题目链接: 合并两个有序链表

有关题目

将两个升序链表合并为一个新的 升序 链表并返回。
新链表是通过拼接给定的两个链表的所有节点组成的。

示例 2:

输入:l1 = [], l2 = []
输出:[]
示例 3:

输入:l1 = [], l2 = [0]
输出:[0]
提示:

两个链表的节点数目范围是 [0, 50]
-100 <= Node.val <= 100
l1 和 l2 均按 非递减顺序 排列

题解

法一:递归
代码一:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        if (!l1 || !l2){
            return !l1 ? l2 : l1;
        }
        ListNode* newHead = l1->val > l2->val ? l2 : l1;
        newHead->next = l1->val > l2->val ? mergeTwoLists(l1, l2->next) : mergeTwoLists(l1->next, l2);
        return newHead;
    }
};

代码二:
参考官方题解

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        if (l1 == nullptr){
            return l2;
        }
        else if (l2 == nullptr){
            return l1;
        }
        else if (l1->val > l2->val){
            l2->next = mergeTwoLists(l1, l2->next);
            return l2;
        }
        else {
            l1->next = mergeTwoLists(l1->next, l2);
            return l1;
        }
    }
};


法二:迭代

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        ListNode *newList = new ListNode(-1);//动态开辟一个节点,存放值为-1

        ListNode *preList = newList;

        while(l1 && l2){
            if (l1->val > l2->val){
                preList->next = l2;
                l2 = l2->next;
            }
            else {
                preList->next = l1;
                l1 = l1->next;
            }

            //每次偏移一步,移动preList节点
            preList = preList->next;
        }

        //l1 与 l2 中至多有一个为遍历完,我们只需将未遍历完的直接赋值
        preList->next = l1 == nullptr ? l2 : l1;
        
        return newList->next;
    }
};

时间复杂度:O(m + n),循环遍历不会超过两个链表的长度之和
空间复杂度:O(1)

以上是关于《LeetCode之每日一题》:137.合并两个有序链表的主要内容,如果未能解决你的问题,请参考以下文章

《LeetCode之每日一题》:274.合并两个有序数组

《LeetCode之每日一题》:285.合并两个有序链表

《LeetCode之每日一题》:285.合并两个有序链表

《LeetCode之每日一题》:205.合并区间

leetcode 每日一题 21. 合并两个有序链表

leetcode每日一题