1. 题目
2. 分析
2.1 方案1
我们可以死循环得遍历每一个链表,一直到所有链表都为空。例如: 空间复杂度是:o(总数 * 链表数 * 链表长度)大概为o(n^4) n为链表数量
2.2 方案2
借助归并排序或者堆排序的私聊,我们可以以n的时间复杂度完成排序;
3. 代码
3.1 方案一代码
public ListNode mergeKLists(ListNode[] lists) {
ListNode pre = new ListNode(0);
ListNode head = pre;
while (true) {
int index = 0;
ListNode max = null;
for (int i = 0; i < lists.length; i++) {
if (null == lists[i]) {
continue;
}
if (null == max) {
max = lists[i];
index = i;
continue;
}
if (lists[i].val < max.val) {
max = lists[i];
index = i;
}
}
if (max == null) {
return pre.next;
}
head.next = max;
head = head.next;
lists[index] = lists[index].next;
}
}
3.2 方案二代码
public ListNode mergeKLists(ListNode[] lists) {
PriorityQueue<ListNode> priorityQueue = new PriorityQueue<>(new Comparator<ListNode>() {
@Override
public int compare(ListNode o1, ListNode o2) {
return o1.val - o2.val;
}
});
//排序
for (ListNode list : lists) {
while (null != list) {
ListNode temp = list;
priorityQueue.offer(list);
list = list.next;
temp.next = null;
}
}
//
ListNode newHead = new ListNode(0);
ListNode head = newHead;
while (!priorityQueue.isEmpty()) {
head.next = priorityQueue.poll();
head = head.next;
}
return newHead.next;
}