1、题目描述:

2、 解决方案

题目分析:

  • 两个目标链表,是两个【升序链表】,也就是说这两个链表自身都是【已经排好序】的

前提:链表的结构体

class ListNode{int val;ListNode next;ListNode(int val){this.val = val;}
}

2-1、迭代思路:

在两个已经排好序的链表中,进行合并,其实就是两个元素比较,较小的元素先进行最后输出链表,这样对应的这个链表继续遍历下一个元素,然后仍然这样比较即可。

具体代码如下:

class Solution{public ListNode mergeTwoLists(ListNode list1, ListNode list2) {ListNode head = new ListNode(-1);ListNode dummy = head;while(list1 != null && list2 !=null){if(list1.val < list2.val){head.next= list1;list1 = list1.next;}else{head.next = list2;list2 = list2.next;}} //此时list1和list2其中一个链表为null,head.next连接上非null链表head.next = (list1==null)?list2 : list1;//最后返回整个链表return dummy.next;}
}

复杂度分析

时间复杂度:O(n + m),其中 n和 m 分别为两个链表的长度。因为每次循环迭代中,l1 和 l2 只有一个元素会被放进合并链表中, 因此 while 循环的次数不会超过两个链表的长度之和。所有其他操作的时间复杂度都是常数级别的,因此总的时间复杂度为 O(n+m)。

空间复杂度:O(1)。我们只需要常数的空间存放若干变量。

方法2: 递归法

相比较迭代法,递归法有些绕,具体代码如下:

class Solution{public ListNode mergeTwoLists(ListNode list1, ListNode list2) {if(list1 == null){return list2;}else if(list2 == null){return list1;}else if(list1.val < list2.val){list1.next = mergeTwoLists(list1.next, list2);return list1;}else{list2.next = mergeTwoLists(list1, list2.next);return list2;}}
}

复杂度分析

时间复杂度:O(n + m),其中 n 和 m 分别为两个链表的长度。因为每次调用递归都会去掉 l1 或者 l2 的头节点(直到至少有一个链表为空),函数 mergeTwoList 至多只会递归调用每个节点一次。因此,时间复杂度取决于合并后的链表长度,即 O(n+m)。

空间复杂度:O(n + m),其中 n 和 m 分别为两个链表的长度。递归调用 mergeTwoLists 函数时需要消耗栈空间,栈空间的大小取决于递归调用的深度。结束递归调用时 mergeTwoLists 函数最多调用 n+m 次,因此空间复杂度为 O(n+m)。

21. 合并两个有序链表相关推荐

  1. 【LeetCode】【HOT】21. 合并两个有序链表(递归)

    [LeetCode][HOT 100]21. 合并两个有序链表 文章目录 [LeetCode][HOT 100]21. 合并两个有序链表 package hot;import java.util.Ar ...

  2. [递归|迭代] leetcode 21 合并两个有序链表

    [递归|迭代] leetcode 21 合并两个有序链表 1.题目 题目链接 将两个升序链表合并为一个新的升序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2 ...

  3. leetcode 21 java_LeetCode 21. 合并两个有序链表

    LeetCode 21. 合并两个有序链表 题目 将两个升序链表合并为一个新的升序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1-> ...

  4. Java实现 LeetCode 21 合并两个有序链表

    21. 合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1 ...

  5. LeetCode 21. 合并两个有序链表(链表)

    上一篇博客:LeetCode 20. 有效的括号(栈.字符串)  写在前面:大家好!我是ACfun,我的昵称来自两个单词Accepted和fun.我是一个热爱ACM的蒟蒻.最近萌生了刷LeetCode ...

  6. 21. 合并两个有序链表 JavaScript实现

    21. 合并两个有序链表 合并有序链表 一.递归 递归详解 /*** Definition for singly-linked list.* function ListNode(val, next) ...

  7. 两个有序链表序列的交集_LeetCode | 21.合并两个有序链表

    点击上方蓝字关注我们 1.LeetCode | 2.两数相加 2.LeetCode | 206.反转链表 3.LeetCode | 1.两数之和 4.LeetCode | 703.数据流中的第K大元素 ...

  8. 【Java】leetCode 21 合并两个有序链表

    题目 : 将两个升序链表合并为一个新的 升序 链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 解题思路 : 1.依据以上两个升序链表进行拼接: 2.先定义一个傀儡节点newHead,用来 ...

  9. LeetCode 21合并两个有序链表22括号生成

    微信搜索bigsai,回复进群,加入打卡.维护不易,欢迎点赞支持! 合并两个有序列表 将两个升序链表合并为一个新的 升序 链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1 ...

  10. LeetCode 21. 合并两个有序链表(单链表)

    文章目录 1. 题目信息 2. 解题 1. 题目信息 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例:输入:1->2->4, 1-> ...

最新文章

  1. Nginx源码分析--基本数据类型的别名
  2. 深入浅出Pytorch:02 PyTorch基础知识
  3. 王孟源:中国要崛起,基础科研需要“讲实话
  4. 线程基础知识——Windows核心编程学习手札系列之六
  5. 诺基亚5800WIFI设置教程
  6. 【Python 2 到 3 系列】 print 是函数
  7. 蓝桥杯 试题 基础练习 特殊回文数——16行代码AC
  8. JS之Number的toString方法
  9. Hadoop-MapReduce
  10. SMB扫描-Server Message Block 协议、nmap
  11. 浅析 Community Server 在线用户列表与位置跟踪实现机制[原创]
  12. LDAP认证-ldap介绍
  13. LigerUI初学篇---使用LigerUI制作简洁清爽的界面
  14. mysql删除通用日志_删除MySQL log bin 日志操作记录
  15. 计算机操作员要求,计算机操作员教学大纲
  16. 2023程序员秋招准备 c/c++Linux后端开发岗(简历/技术面)技能体系总结
  17. Python获取中国疫情数据(最新版)
  18. 基于微信小程序的在线考试系统开题报告
  19. 手机自动拨号软件_手机自动拨号是灵异事件?我信你个鬼
  20. AutoJsPro简介

热门文章

  1. 应用常驻后台?需要用户对手机做配置
  2. 国标高数教材搞乱了微积分学界
  3. 华为android界面强刷救砖教程,华为手机救砖教程 华为手机开不了机变砖自救
  4. 操作系统与软件工程学习笔记
  5. 小程序微信聊天功能中发送emoji表情
  6. 5个超实用的Excel数据透视表技巧
  7. 复域,频域,时域之间关系,转换,s平面(转)
  8. 安装linux取消硬盘密码设置,linux下硬盘加密方法
  9. 微信公众号与服务器ip,微信公众号服务器IP网段与实际IP不一致?无法通过微信公众号推送消息到自己的服务器...
  10. 易接SDK ios9以上无法弹出充值界面的一种情况