美文网首页算法
[LeetCode OJ]- Merge K Sorted Li

[LeetCode OJ]- Merge K Sorted Li

作者: 其中一个cc | 来源:发表于2017-03-07 21:57 被阅读0次

    今天在对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;

    }

    }

    }

    相关文章

      网友评论

        本文标题:[LeetCode OJ]- Merge K Sorted Li

        本文链接:https://www.haomeiwen.com/subject/yadvgttx.html