1.题目
2.解法
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
// 每轮将两两链表合并,直到最后只剩一个链表
// 重复使用已有的lists
int len = lists.length;
if (len == 0) {
return null;
}
while (len > 1) {
for (int i = 0; i < len/2 ; i++) {
// 如果使用2*i、2*i+1下标的话,会使得存储的数组元素不连续
lists[i] = mergeTlists(lists[i], lists[len-1-i]);
}
len = (len + 1) / 2;
}
return lists[0];
}
public ListNode mergeTlists(ListNode tmp1, ListNode tmp2) {
ListNode dummy = new ListNode(0);
ListNode head = dummy;
while (tmp1 != null && tmp2 != null) {
if (tmp1.val >= tmp2.val) {
head.next = tmp2;
tmp2 = tmp2.next;
} else {
head.next = tmp1;
tmp1 = tmp1.next;
}
head = head.next;
}
head.next = tmp1 != null ? tmp1 : tmp2;
return dummy.next;
}
}
时间复杂度O(Nlogk) k为链表个数,N为链表平均长度 ,每次合并logk次,总共有N个需要连接,空间复杂度O(1),使用常数级变量