当前位置:网站首页>【Hot100】23. 合并K个升序链表
【Hot100】23. 合并K个升序链表
2022-07-02 18:54:00 【王六六的IT日常】
23. 合并K个升序链表
困难题
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
思路:逐一合并两条链表
首先复习一下【Hot100】21. 合并两个有序链表
下面分别贴出「merge2Lists」的「递归」 和 「迭代」两种实现 :
- 递归
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;
}
}
}
- 迭代
private ListNode merge2Lists(ListNode l1, ListNode l2) {
ListNode dummyHead = new ListNode(0);
ListNode tail = dummyHead;
while (l1 != null && l2 != null) {
if (l1.val < l2.val) {
tail.next = l1;
l1 = l1.next;
} else {
tail.next = l2;
l2 = l2.next;
}
tail = tail.next;
}
tail.next = l1 == null? l2: l1;
return dummyHead.next;
}
- 逐一合并
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
ListNode res = null;
for (ListNode list: lists) {
res = merge2Lists(res, list);
}
return res;
}
}
两两合并对 1 进行优化:
- 两两合并 - 迭代
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
if (lists.length == 0) {
return null;
}
int k = lists.length;
while (k > 1) {
int idx = 0;
for (int i = 0; i < k; i += 2) {
if (i == k - 1) {
lists[idx++] = lists[i];
} else {
lists[idx++] = merge2Lists(lists[i], lists[i + 1]);
}
}
k = idx;
}
return lists[0];
}
private ListNode merge2Lists(ListNode l1, ListNode l2) {
ListNode dummyHead = new ListNode(0);
ListNode tail = dummyHead;
while (l1 != null && l2 != null) {
if (l1.val < l2.val) {
tail.next = l1;
l1 = l1.next;
} else {
tail.next = l2;
l2 = l2.next;
}
tail = tail.next;
}
tail.next = l1 == null? l2: l1;
return dummyHead.next;
}
}
- 两两合并 - 递归
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
if (lists.length == 0) {
return null;
}
return merge(lists, 0, lists.length - 1);
}
private ListNode merge(ListNode[] lists, int lo, int hi) {
if (lo == hi) {
return lists[lo];
}
int mid = lo + (hi - lo) / 2;
ListNode l1 = merge(lists, lo, mid);
ListNode l2 = merge(lists, mid + 1, hi);
return mergeTwoLists(l1, l2);
}
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;
}
}
}
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
if (lists == null || lists.length == 0) return null;
return merge(lists, 0, lists.length - 1);
}
//合并函数
private ListNode merge(ListNode[] lists, int left, int right) {
if (left == right) return lists[left];
int mid = left + (right - left) / 2;
ListNode l1 = merge(lists, left, mid);
ListNode l2 = merge(lists, mid + 1, right);
return mergeTwoLists(l1, l2);
}
//合并两个升序链表
private ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode dummyHead = new ListNode(0);
ListNode cur = dummyHead;
while (l1 != null && l2 != null) {
if (l1.val < l2.val) {
cur.next = l1;
l1 = l1.next;
} else {
cur.next = l2;
l2 = l2.next;
}
//移动合并链表的下一个节点
cur = cur.next;
}
//如果链表1为空了,则合并链表把链表2剩下的接在后面,否则接链表1节点
if(l1 == null){
cur.next = l2;
}else{
cur.next = l1;
}
//cur.next = l1 == null? l2 : l1;
return dummyHead.next;
}
}
边栏推荐
- 数据湖(十二):Spark3.1.2与Iceberg0.12.1整合
- KT148A语音芯片使用说明、硬件、以及协议、以及常见问题,和参考代码
- NMF-matlab
- AcWing 341. Optimal trade solution (shortest path, DP)
- Génération automatique de fichiers d'annotation d'images vgg
- ShardingSphere-JDBC5.1.2版本关于SELECT LAST_INSERT_ID()本人发现还是存在路由问题
- R语言使用econocharts包创建微观经济或宏观经济图、indifference函数可视化无差异曲线(indifference curve)
- Educational Codeforces Round 129 (Rated for Div. 2) 补题题解
- AcWing 342. Road and route problem solving (shortest path, topological sorting)
- [ERP software] what are the dangers of the secondary development of ERP system?
猜你喜欢

Common problems and description of kt148a voice chip IC development

Istio1.12: installation and quick start

KT148A语音芯片ic的用户端自己更换语音的方法,上位机

sql-labs

Dictionaries

AcWing 340. 通信线路 题解(二分+双端队列BFS求最短路)

B端电商-订单逆向流程

Conscience summary! Jupyter notebook from Xiaobai to master, the nanny tutorial is coming!

Istio部署:快速上手微服务,

mysql函数
随机推荐
Start practicing calligraphy
CRM客户关系管理系统
B端电商-订单逆向流程
GCC: Graph Contrastive Coding for Graph Neural NetworkPre-Training
高并发下如何避免产生重复数据?
Educational codeforces round 129 (rated for Div. 2) supplementary problem solution
AcWing 1128. 信使 题解(最短路—Floyd)
Py's interpret: a detailed introduction to interpret, installation, and case application
多态的理解以及作用
AcWing 1125. 牛的旅行 题解(最短路、直径)
使用IDM下载百度网盘的文件(亲测有用)[通俗易懂]
AcWing 1137. 选择最佳线路 题解(最短路)
Use IDM to download Baidu online disk files (useful for personal testing) [easy to understand]
分享几个图床网址,便于大家分享图片
453-atoi函数的实现
Detailed explanation of VBScript (I)
Common problems and description of kt148a voice chip IC development
HDL design peripheral tools to reduce errors and help you take off!
Cuckoo filter
AcWing 1129. Heat wave solution (shortest path SPFA)