牛客热题:合并升序链表

📟作者主页:慢热的陕西人

🌴专栏链接:力扣刷题日记

📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言

在这里插入图片描述

牛客热题:合并升序链表

题目链接

合并两个排序的链表_牛客题霸_牛客网 (nowcoder.com)

方法一:简单迭代

思路

简单迭代:

  • 设置一个哨兵位头节点head
  • 同时遍历两个有序链表,谁的值小就将其的值尾插到哨兵头节点所在的指针;
  • 最后可能会有某一个有序链表未被遍历完毕的情况:那么我们分别遍历即可

代码

ListNode* Merge(ListNode* pHead1, ListNode* pHead2) 
    {
        //申请一个哨兵位
        ListNode* head = new ListNode(0);

        ListNode* cur = head;
        while(pHead1 != nullptr && pHead2 != nullptr)
        {
            if(pHead1->val <= pHead2->val)
            {
                cur->next = pHead1;
                cur = cur->next;
                pHead1 = pHead1->next;
            }
            else 
            {
                cur->next = pHead2;
                cur = cur->next;
                pHead2 = pHead2->next;
            }
        }

        //p1未完的情况
        while(pHead1 != nullptr)
        {
            cur->next = pHead1;
            cur = cur->next;
            pHead1 = pHead1->next;
        }

        //p2未完的情况
        while(pHead2 != nullptr)
        {
            cur->next = pHead2;
            cur = cur->next;
            pHead2 = pHead2->next;
        }

        return head->next;
    }

复杂度

时间复杂度:O(N + M) ,遍历一次两个链表

空间复杂度:O(1) ,只使用了常数量级的变量个数

方法二:递归

思路

递归:

  • 由题意可知Merge(ListNode* pHead1, ListNode* pHead2)的功能是合并这两个链表并使新链表中的节点仍然是递增排序的。

  • 那么我们可以利用这个特性,得到两个结论:

    ①当pHead1->val <= pHead2->val

    这时候我们当前的节点一定是以pHead1开头,并且pHead1->next的后面紧接着是pHead1->nextpHead2有序排列好的链表,那么可以表示为如下的代码:

            if(pHead1->val <= pHead2->val)
            {
                pHead1->next = Merge(pHead1->next, pHead2);
                return pHead1;
            }
    

    ②当pHead1->val > pHead2->val

    则可以表示为:

            else 
            {
                pHead2->next = Merge(pHead1, pHead2->next);
                return pHead2;
            }
    
  • 截止条件:当pHead1或者pHead2中有一个是空指针的时候,我们就返回其中哪个不为空的指针;

    若两个都为空指针,那么就随便返回其中一个

代码

    ListNode* Merge(ListNode* pHead1, ListNode* pHead2) 
    {
        if(pHead1 == nullptr || pHead2 == nullptr)
        return pHead1 == nullptr ? pHead2 : pHead1;

        if(pHead1->val <= pHead2->val)
        {
            pHead1->next = Merge(pHead1->next, pHead2);
            return pHead1;
        }
        else 
        {
            pHead2->next = Merge(pHead1, pHead2->next);
            return pHead2;
        }
    }

复杂度

时间复杂度:O(N + M) ,遍历一次两个链表

空间复杂度:O(N + M) ,迭代次数占用空间

相关推荐

  1. 【LeetCode】100:合并K个升序

    2024-05-01 00:10:01       35 阅读
  2. 【LeetCode100】【合并 K 个升序

    2024-05-01 00:10:01       33 阅读
  3. leetcodeHOT 23. 合并 K 个升序

    2024-05-01 00:10:01       40 阅读
  4. LeetCode-100:23. 合并 K 个升序

    2024-05-01 00:10:01       32 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-01 00:10:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-01 00:10:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-05-01 00:10:01       82 阅读
  4. Python语言-面向对象

    2024-05-01 00:10:01       91 阅读

热门阅读

  1. 华为鸿蒙HarmonyOS应用开发者高级认证答案

    2024-05-01 00:10:01       32 阅读
  2. Github 2024-04-24 C开源项目日报 Top9

    2024-05-01 00:10:01       28 阅读
  3. LeeCode 1728 任意图上博弈

    2024-05-01 00:10:01       33 阅读
  4. 爬虫 - 基于requests进行二次开发

    2024-05-01 00:10:01       29 阅读
  5. 算法训练营day28

    2024-05-01 00:10:01       31 阅读
  6. php变量创建和定义规则和常见常量

    2024-05-01 00:10:01       33 阅读
  7. 【设计模式】13、template 模板模式

    2024-05-01 00:10:01       30 阅读
  8. 使用ssh一台机器跳转到另一台机器

    2024-05-01 00:10:01       32 阅读
  9. 洛谷 P1055 [NOIP2008 普及组] ISBN 号码

    2024-05-01 00:10:01       37 阅读
  10. Git分支策略与工作流

    2024-05-01 00:10:01       40 阅读
  11. MySQL面试题:经典面试题之“B+树”

    2024-05-01 00:10:01       28 阅读