当前位置:网站首页>leetcode一步解决链表合并问题
leetcode一步解决链表合并问题
2022-08-02 05:08:00 【你食不食油饼】
1、合并两个有序链表
题目描述:
思路:合并两个有序链表也是一个很经典的题目,看到这道题目,不少的小伙伴估计会有种似曾相识的感觉,是不是有点像,合并两个数组哈哈哈哈,所以我们首先先用笨方法(依次比较)l来试试
1、依次比较
看看代码:
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
ListNode cur = new ListNode(0);
ListNode result = cur;
ListNode temp1 = list1;
ListNode temp2 = list2;
while (temp1 != null && temp2 != null){
if (temp1.val < temp2.val){
cur.next = temp1;
temp1 = temp1.next;
cur = cur.next;
}else {
cur.next = temp2;
temp2 = temp2.next;
cur = cur.next;
}
}
if (temp1 == null){
while (temp2 != null){
cur.next = temp2;
temp2 = temp2.next;
cur = cur.next;
}
}else if (temp2 == null){
while (temp1 != null){
cur.next = temp1;
temp1 = temp1.next;
cur = cur.next;
}
}
return result.next;
}
时间复杂度:O(n)
空间复杂度:O(1)
2、递归
思路:既然是递归我们就会想到这道题的递归三要素
- 终止条件:list1为空,或者list2为空
- 返回值:每一层都返回已经排序好的链表
- 本机递归内容:如果list1.val更小,则将list1.next和下一级排序好的链表连接;list2反之亦然
我们看看代码:
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
if (list1 == null) return list2;
if (list2 == null) return list1;
if (list1.val<list2.val){
list1.next = mergeTwoLists(list1.next,list2);
return list1;
}else {
list2.next = mergeTwoLists(list1,list2.next);
return list2;
}
}
时间复杂度:O(m+n),m为list1的长度,n为list2的长度
2、合并k个升序链表
题目描述:
思路:拿到题目,首先我们先审题,合并k条,其实本质上和合并2条升序链表没有区别,我们只需要拆分,把k条链表,拆分成若干个2条链表,思路瞬间是不是清晰了!
至于如何拆分,我不知道大家有没有了解过 归并排序 ,大家又不了解的可以移步归并排序
归并排序里面用到的思想就是分治算,先分后治,先拆分,后合并,是不是跟咱们这道题有异曲同工之妙,先把链表拆分,再把链表合并;唯一不同的是归并排序时,我们是拆分同一个数组,而现在我们是拆分k条不同的链表,不过我们要得到的效果都是一样的!
了解完之后,我们不妨看看代码:
public ListNode mergeKLists(ListNode[] lists) {
if (lists.length < 1) return null;
return mergeLists(lists, 0, lists.length);
}
public ListNode mergeLists(ListNode[] lists, int left, int right) {
if (left >= right) return lists[left];
int mid = (left + right) / 2;
//先分
ListNode l1 = mergeLists(lists, left, mid);
ListNode l2 = mergeLists(lists, mid + 1, right);
//后治
return mergeTwoLists(l1, l2);
}
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
if (list1 == null) return list2;
if (list2 == null) return list1;
if (list1.val < list2.val) {
list1.next = mergeTwoLists(list1.next, list2);
return list1;
} else {
list2.next = mergeTwoLists(list1, list2.next);
return list2;
}
}
这里为了优化我们合并算法的时间复杂度,我们可以采用迭代算法,也就是第一题的第一张方法替代这个合并递归方法,会加快不少时间
public ListNode mergeKLists(ListNode[] lists) {
if (lists.length < 1) return null;
return mergeLists(lists, 0, lists.length);
}
public ListNode mergeLists(ListNode[] lists, int left, int right) {
if (left >= right) return lists[left];
int mid = (left + right) / 2;
//先分
ListNode l1 = mergeLists(lists, left, mid);
ListNode l2 = mergeLists(lists, mid + 1, right);
//后治
return mergeTwoLists(l1, l2);
}
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
ListNode cur = new ListNode(0);
ListNode result = cur;
ListNode temp1 = list1;
ListNode temp2 = list2;
while (temp1 != null && temp2 != null){
if (temp1.val < temp2.val){
cur.next = temp1;
temp1 = temp1.next;
cur = cur.next;
}else {
cur.next = temp2;
temp2 = temp2.next;
cur = cur.next;
}
}
if (temp1 == null){
while (temp2 != null){
cur.next = temp2;
temp2 = temp2.next;
cur = cur.next;
}
}else if (temp2 == null){
while (temp1 != null){
cur.next = temp1;
temp1 = temp1.next;
cur = cur.next;
}
}
return result.next;
}
总结:合并升序链表,也是笔试常考的一道题,大家很有必要学习一下~
边栏推荐
猜你喜欢
Introduction and use of apifox (1).
Navicat如何连接MySQL
Navicat cannot connect to mysql super detailed processing method
关于web应用的目录结构
ERROR 1045 (28000) Access denied for user 'root'@'localhost'Solution
Automated operation and maintenance tools - ansible, overview, installation, module introduction
About the directory structure of the web application
The company does not pay attention to software testing, and the new Ali P8 has written a test case writing specification for us
利用浏览器本地存储 实现记住用户名的功能
6W+字记录实验全过程 | 探索Alluxio经济化数据存储策略
随机推荐
Mysql common commands
5年在职经验之谈:2年功能测试、3年自动化测试,从入门到不可自拔...
apisix-Getting Started
nacos注册中心
自动化运维工具——ansible、概述、安装、模块介绍
提高软件测试能力的方法有哪些?看完这篇文章让你提升一个档次
软件测试在职2年跳槽4次,你还在怪老板不给你涨薪?
Shuttle + Alluxio 加速内存Shuffle起飞
[PSQL] 函数、谓词、CASE表达式、集合运算
51 MCU Peripherals: Infrared Communication
MySQL导入sql文件的三种方法
高防服务器防御的原理是什么
Linux CentOS8安装Redis6
swinIR论文阅读笔记
Stress testing and performance analysis of node projects
What do interview test engineers usually ask?The test supervisor tells you
21 Day Learning Challenge Schedule
leetcode 204. Count Primes 计数质数 (Easy)
What are the ways to improve software testing capabilities?After reading this article, it will take you up a notch
Three methods of importing sql files in MySQL