21. 合并两个有序链表
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. 合并两个有序链表相关推荐
- 【LeetCode】【HOT】21. 合并两个有序链表(递归)
[LeetCode][HOT 100]21. 合并两个有序链表 文章目录 [LeetCode][HOT 100]21. 合并两个有序链表 package hot;import java.util.Ar ...
- [递归|迭代] leetcode 21 合并两个有序链表
[递归|迭代] leetcode 21 合并两个有序链表 1.题目 题目链接 将两个升序链表合并为一个新的升序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2 ...
- leetcode 21 java_LeetCode 21. 合并两个有序链表
LeetCode 21. 合并两个有序链表 题目 将两个升序链表合并为一个新的升序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1-> ...
- Java实现 LeetCode 21 合并两个有序链表
21. 合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1 ...
- LeetCode 21. 合并两个有序链表(链表)
上一篇博客:LeetCode 20. 有效的括号(栈.字符串) 写在前面:大家好!我是ACfun,我的昵称来自两个单词Accepted和fun.我是一个热爱ACM的蒟蒻.最近萌生了刷LeetCode ...
- 21. 合并两个有序链表 JavaScript实现
21. 合并两个有序链表 合并有序链表 一.递归 递归详解 /*** Definition for singly-linked list.* function ListNode(val, next) ...
- 两个有序链表序列的交集_LeetCode | 21.合并两个有序链表
点击上方蓝字关注我们 1.LeetCode | 2.两数相加 2.LeetCode | 206.反转链表 3.LeetCode | 1.两数之和 4.LeetCode | 703.数据流中的第K大元素 ...
- 【Java】leetCode 21 合并两个有序链表
题目 : 将两个升序链表合并为一个新的 升序 链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 解题思路 : 1.依据以上两个升序链表进行拼接: 2.先定义一个傀儡节点newHead,用来 ...
- LeetCode 21合并两个有序链表22括号生成
微信搜索bigsai,回复进群,加入打卡.维护不易,欢迎点赞支持! 合并两个有序列表 将两个升序链表合并为一个新的 升序 链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1 ...
- LeetCode 21. 合并两个有序链表(单链表)
文章目录 1. 题目信息 2. 解题 1. 题目信息 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例:输入:1->2->4, 1-> ...
最新文章
- Nginx源码分析--基本数据类型的别名
- 深入浅出Pytorch:02 PyTorch基础知识
- 王孟源:中国要崛起,基础科研需要“讲实话
- 线程基础知识——Windows核心编程学习手札系列之六
- 诺基亚5800WIFI设置教程
- 【Python 2 到 3 系列】 print 是函数
- 蓝桥杯 试题 基础练习 特殊回文数——16行代码AC
- JS之Number的toString方法
- Hadoop-MapReduce
- SMB扫描-Server Message Block 协议、nmap
- 浅析 Community Server 在线用户列表与位置跟踪实现机制[原创]
- LDAP认证-ldap介绍
- LigerUI初学篇---使用LigerUI制作简洁清爽的界面
- mysql删除通用日志_删除MySQL log bin 日志操作记录
- 计算机操作员要求,计算机操作员教学大纲
- 2023程序员秋招准备 c/c++Linux后端开发岗(简历/技术面)技能体系总结
- Python获取中国疫情数据(最新版)
- 基于微信小程序的在线考试系统开题报告
- 手机自动拨号软件_手机自动拨号是灵异事件?我信你个鬼
- AutoJsPro简介
热门文章
- 应用常驻后台?需要用户对手机做配置
- 国标高数教材搞乱了微积分学界
- 华为android界面强刷救砖教程,华为手机救砖教程 华为手机开不了机变砖自救
- 操作系统与软件工程学习笔记
- 小程序微信聊天功能中发送emoji表情
- 5个超实用的Excel数据透视表技巧
- 复域,频域,时域之间关系,转换,s平面(转)
- 安装linux取消硬盘密码设置,linux下硬盘加密方法
- 微信公众号与服务器ip,微信公众号服务器IP网段与实际IP不一致?无法通过微信公众号推送消息到自己的服务器...
- 易接SDK ios9以上无法弹出充值界面的一种情况