LeetCode21

Posted 臭咸鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode21相关的知识,希望对你有一定的参考价值。

题目介绍

题解一

解题思路

  • 递归法

    取出当前2个链表中头结点较小的那个链表的头结点,然后通过递归将2个链表合并(a->nextb)。

  • 复杂度分析

    假设3个链表分别有n和m个结点,则时间复杂度为\\(O(n+m)\\)、空间复杂度为\\(O(n+m)\\)

代码

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        // 边界和递归出口
        if(nullptr==l1){return l2;}
        if(nullptr==l2){return l1;}
        // 递归表达式
        if(l1->val<l2->val){
            l1->next = mergeTwoLists(l1->next, l2);
            return l1;
        }
        else{
            l2->next = mergeTwoLists(l2->next, l1);
            return l2;
        }
    }
};

题解二

解题思路

  • 迭代法

    用pre保存前1个结点,用2个指针分别遍历这2个链表每次取出值最小的结点,然后拼接成新的链表。当其中1个链表遍历结束,将另外1个链表直接拼接在新的链表的尾部。

  • 复杂度分析

    假设2个链表的长度分别是n和m,则最大时间复杂度为\\(O(n+m)\\)、空间复杂度为\\(O(1)\\)

代码

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        // 定义头结点,方便建立新链表
        ListNode *head = new ListNode(-1);
        // 遍历链表用的指针
        ListNode *l3 = head;
        // 同时遍历两个链表并拼接值较小的结点到新链表中,同步更新链表指针,直至某个链表遍历结束
        while (l1 != nullptr && l2 != nullptr){
            if (l1->val < l2->val){
                l3->next = l1;
                l1 = l1->next;
            }else{
                l3->next = l2;
                l2 = l2->next;
            }
            l3 = l3->next;
        }
        // 将未遍历完的链表拼接至新链表
        if(l1!=nullptr){
            l3->next = l1;
        }
        if (l2 != nullptr){
            l3->next = l2;
        }

        // 释放无意义头结点并返回其next
        l3 = head->next;
        delete head;
        return l3;
    }
};

作者:@臭咸鱼

转载请注明出处:https://www.cnblogs.com/chouxianyu/

欢迎讨论和交流!


以上是关于LeetCode21的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode.1024 视频拼接

14.VisualVM使用详解15.VisualVM堆查看器使用的内存不足19.class文件--文件结构--魔数20.文件结构--常量池21.文件结构访问标志(2个字节)22.类加载机制概(代码片段

片段中的 Asynctask 未到达 onPostExecute

C 中的共享内存代码片段

LeetCode810. 黑板异或游戏/455. 分发饼干/剑指Offer 53 - I. 在排序数组中查找数字 I/53 - II. 0~n-1中缺失的数字/54. 二叉搜索树的第k大节点(代码片段

LEETCODE 003 找出一个字符串中最长的无重复片段