描述
合并\ k k 个已排序的链表并将其作为一个已排序的链表返回。分析并描述其复杂度。
示例1
输入:
[{1,2,3},{4,5,6,7}]
复制返回值:
{1,2,3,4,5,6,7}
思路
采用数组归并排序的思想, 只不过里面的数组元素是链表而已....
速度似乎还不错
import java.util.*;
public class Solution {
public ListNode mergeKLists(ArrayList<ListNode> lists) {
if(lists == null || lists.size() <= 0)
return null;
// 只有一个链表直接返回结果
if(lists.size() == 1)
return lists.get(0);
int length = lists.size();
// 左半部分的链表
ArrayList<ListNode>left = new ArrayList<>();
// 右半部分的链表
ArrayList<ListNode>right = new ArrayList<>();
int i =0;
for(i = 0; i < length / 2 ;i++){
left.add(lists.get(i));
}
for(i = length /2; i < length; i++){
right.add(lists.get(i));
}
// 对左半部分链表排序
ListNode head1 = mergeKLists(left);
// 对右半部分的链表进行排序
ListNode head2 = mergeKLists(right);
ListNode fake = new ListNode(-1);
ListNode pre = fake;
// 合并成一个链表
while (head1 != null && head2 != null){
if(head1.val < head2.val){
pre.next = head1;
pre = pre.next;
head1 = head1.next;
}else{
pre.next = head2;
pre = pre.next;
head2 = head2.next;
}
}
pre.next = (head1 != null ? head1 : head2);
return fake.next;
}
public static void main(String[] args) {
Solution ss = new Solution();
ListNode a = new ListNode(1);
ListNode b = new ListNode(2);
ListNode c = new ListNode(3);
ListNode d = new ListNode(4);
ListNode e = new ListNode(5);
ListNode f = new ListNode(6);
ListNode g = new ListNode(7);
a.next = b;
b.next = c;
d.next = e;
e.next = f;
f.next = g;
Solution s = new Solution();
ArrayList<ListNode> list= new ArrayList<>();
list.add(a);
list.add(d);
ListNode res = s.mergeKLists(list);
while (res != null){
System.out.println(res.val);
res = res.next;
}
}
}