当前位置:网站首页>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;
}总结:合并升序链表,也是笔试常考的一道题,大家很有必要学习一下~
边栏推荐
猜你喜欢

51 MCU peripherals: ADC

【合集- 行业解决方案】如何搭建高性能的数据加速与数据编排平台

MySQL 5.7 detailed download, installation and configuration tutorial

C语言中i++和++i在循环中的差异性

leetcode每天5题-Day04

The Go language learning notes - dealing with timeout - use the language from scratch from Context

APP Bluetooth connection test of test technology

ApiPost is really fragrant and powerful, it's time to throw away Postman and Swagger

Stress testing and performance analysis of node projects

测试环境要多少?从成本与效率说起
随机推荐
服务器的单机防御与集群防御
51 MCU Peripherals: Infrared Communication
测试环境要多少?从成本与效率说起
TikTok平台的两种账户有什么区别?
ELK log analysis system
21 Day Learning Challenge Schedule
Introduction to Grid Layout
The original question on the two sides of the automatic test of the byte beating (arranged according to the recording) is real and effective 26
Mysql implements optimistic locking
51单片机外设篇:ADC
eggjs controller层调用controller层解决方案
100 latest software testing interview questions in 2022, summary of common interview questions and answers
JUC(一)- JUC学习概览 - 对JUC有一个整体的认识
Difference and analysis of CPU usage and load
分布式文件存储服务器之Minio对象存储技术参考指南
C 竞赛——捕鱼
C竞赛训练
The company does not pay attention to software testing, and the new Ali P8 has written a test case writing specification for us
How much does a test environment cost? Start with cost and efficiency
coredns介绍