今天在對2個list進行排序后,順便做了下對K個list排序。
想的思路大概是,先通過某種方法,讓這K個list最終都變成兩個兩個的list進行排序,然后調用之兩個list排序的方法。見[LeetCode OJ]- Merge 2 Sorted Lists
那么怎么做合適呢?想到了上上學期算法課上學的一個【歸并排序】的東東。說起來當時還不太理解,但是覺得歸并排序不就是把一大堆數據,先折半折半再折半(二叉二叉再二叉)一直到只剩下葉子節點,然后從葉子節點開始,相鄰的節點進行兩兩排序,從底向上,一直到根節點。
偽代碼是這樣的:
形象一點理解歸并排序,參考這個圖
理解了歸并排序的思想,代碼就很好實現了。
/**
* Definition for singly-linked list.
* public class ListNode {
*? ? int val;
*? ? ListNode next;
*? ? ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode mergeKLists(ListNode[] lists) {
return partition(lists, 0, lists.length - 1);
}
public static ListNode partition(ListNode[] listnode,int h,int r){
if(h == r) return listnode[h];
else if(h < r){
int m = (h + r)/2;
ListNode l1 = partition(listnode, h, m);
ListNode l2 = partition(listnode, m + 1, r);
return mergeTwoLists(l1, l2);
}
else 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)
{
l1.next = mergeTwoLists(l1.next , l2);
return l1;
}
else
{
l2.next = mergeTwoLists(l1, l2.next);
return l2;
}
}
}