题目链接:https://leetcode.com/problems/merge-k-sorted-lists/
题目:
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
思路:
注意要保存合并后新表头集合,合并迭代退出的条件是表头集合size为1。空间复杂度为O(n),时间复杂度为O(nlogn)。
设迭代合并链表次数为k,初始链表个数为n,则满足2^k=n,即k=log2(n)。因为每次合并两条链表时间复杂度为O(n),
所以整个算法时间复杂度为O(nlogn)。
算法:
public ListNode mergeKLists(ListNode[] lists) {
if (lists.length == 0)
return null;
List<ListNode> heads = new ArrayList<ListNode>();// 存放每次合并后的新表头
for (int i = 0; i < lists.length; i++) { //
heads.add(lists[i]);
}
while (heads.size() > 1) {
List<ListNode> head2 = new ArrayList<ListNode>();
for (int i = 0; i + 1 < heads.size(); i += 2) {
ListNode l1 = heads.get(i);
ListNode l2 = heads.get(i + 1);
head2.add(mergeTwoLists(l1, l2));// 合并后新表头集合
}
if (heads.size() % 2 == 1) { // 如果表头个数是奇数,要把最后一个表头加进来
head2.add(heads.get(heads.size() - 1));
}
heads = new ArrayList<ListNode>(head2);
}
return heads.get(0);
}
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode head = null, l, p = l1, q = l2;
// ==确定头节点
if (p != null && q != null) {
if (p.val < q.val) {
head = p;
p = p.next;
} else {
head = q;
q = q.next;
}
} else if (p == null) {
head = q;
return head;
} else if (q == null) {
head = p;
return head;
}
l = head;
// ===end
while (p != null && q != null) {
if (p.val < q.val) {
l.next = p;
l = p;
p = p.next;
} else {
l.next = q;
l = q;
q = q.next;
}
}
if (p == null) {
l.next = q;
} else if (q == null) {
l.next = p;
}
return head;
}