23. 合并 K 个升序链表
问题描述
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例 1:
输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下:
[
1->4->5,
1->3->4,
2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6
示例 2:
输入:lists = []
输出:[]
示例 3:
输入:lists = [[]]
输出:[]
提示:
k == lists.length
0 <= k <= 10^4
0 <= lists[i].length <= 500
-10^4 <= lists[i][j] <= 10^4
lists[i]
按 升序 排列lists[i].length
的总和不超过10^4
解题思路与代码实现
主要思路:
在合并两个有序链表的基础上,使用辅助队列,两两进行合并。
/**
* 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 {
/**
* 合并k个有序链表
*/
public ListNode mergeKLists(ListNode[] lists) {
if (lists == null || lists.length == 0) { // 空数组
return null;
}
LinkedList<ListNode> queue = new LinkedList<>(); // 辅助队列
for (ListNode node : lists) {
queue.addLast(node);
}
while (queue.size() >= 2) {
// 两两链表进行合并
ListNode l1 = queue.removeFirst();
ListNode l2 = queue.removeFirst();
queue.addLast(mergeTwoLists(l1, l2));
}
// 返回最后的有序链表
return queue.removeFirst();
}
/**
* 合并两个有序链表
*/
private ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null) {
return l2;
}
if (l2 == null) {
return l1;
}
ListNode p1 = l1, p2 = l2;
ListNode newHead = new ListNode(0), r = newHead;
while (p1 != null && p2 != null) {
if (p1.val < p2.val) {
ListNode temp = p1;
r.next = p1;
p1 = p1.next;
temp.next = null;
} else {
ListNode temp = p2;
r.next = p2;
p2 = p2.next;
temp.next = null;
}
r = r.next;
}
if (p1 != null) {
r.next = p1;
}
if (p2 != null) {
r.next = p2;
}
r = newHead;
newHead = newHead.next;
r.next = null;
return newHead;
}
}
踩坑点
无