Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
本题主要就是要让我们把k个已经排好序的linked lists进行一个合并从而组成一个新的排好序的list,对于这种已经排好序的list来说,我最先想到的是归并排序。不过对于我这种菜鸟小白来说,想到归并排序之后出现了一个问题-----我所认识到的归并排序是对一个数组进行排序,而本题中虽然也是一个数组,可是数组内的元素是一个linkedlist,此时想了好久才想明白。其实,还是和对普通数组排序一样。算法的基本思想:
- 对lists[]进行划分,也就是分解;(归并排序最后会将一个数组分解成一个个的单个元素,只不过我们这里是单个的linkedlist)
- 划分完成之后,就是自底向上的归并,即合并。(在合并的时候,对于最基本的归并排序来说,最底层的是单个的数值,我们只需要单纯的比较数值的大小就可以了。而此时,我们需要合并的是两个linkedlist,即就是merge two sorted linked lists,对于这个问题,如果不清楚可以先去了解一下二路合并)
- 合并完成之后,就得到了题目要求的a new sorted list;
下面附上代码:
public class Solution {
public ListNode mergeKLists(ListNode[] lists)
{
return partition(lists, 0, lists.length - 1);
}
public static ListNode partition(ListNode[] lists, int start, int end)
{
if (start == end)
return lists[start];
if (start < end)
{
int mid = (start + end) / 2;
ListNode l1 = partition(lists, start, mid);
ListNode l2 = partition(lists, mid + 1, end);
return mergeTwoLists(l1, l2);
}
return null;
}
public static ListNode mergeTwoLists(ListNode l1, ListNode l2)
{
if (l1 == null)
return l2;
if (l2 == null)
return l1;
if (l1.val > l2.val)
{
ListNode temp = l2;
temp.next = mergeTwoLists(l1, l2.next);
return temp;
}
else
{
ListNode temp = l1;
temp.next = mergeTwoLists(l1.next, l2);
return temp;
}
}
}