给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-k-sorted-lists
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
/**
* 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) {
}
}
BUG解法
思路:将所有链表值放入 List,然后排序,最后一个一个的生成结点~~~
/** * 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) { List<Integer> list = new ArrayList<>(); for (ListNode listNode : lists) { while (listNode != null) { list.add(listNode.val); listNode = listNode.next; } } Collections.sort(list); ListNode head = new ListNode(); ListNode temp = head; for (Integer integer : list) { temp.next = new ListNode(integer); temp = temp.next; } return head.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) {
ListNode result = new ListNode();
for (ListNode node : lists) {
ListNode temp = result;
while (node != null) {
if (temp.next == null) {
temp.next = node;
break;
}
if (temp.next.val >= node.val) {
temp.next = new ListNode(node.val, temp.next);
temp = temp.next;
node = node.next;
} else {
temp = temp.next;
}
}
}
return result.next;
}
}
分治合并
使用优先队列合并
参见 LeetCode 中文官网