LeetCode Merge k Sorted Lists 解决报告

https://oj.leetcode.com/problems/merge-k-sorted-lists/

归并K已经整理阵列,和分析算法的复杂。

解决报告:无论是不考虑优化,最简单的实现是要重新走路List<ListNode>。对当中每一个链表同当前链表做一遍类似于归并排序最后一步的merge操作。

算法复杂度是O(KN)

public class Solution {
    ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        ListNode head    = new ListNode(-1);
        ListNode current = head;
        while(list1!=null&&list2!=null) {
            if(list1.val<list2.val) {
                current.next = list1;
                list1   = list1.next;
            } else {
                current.next = list2;
                list2   = list2.next;
            }
            current = current.next;
        }
        if(list1!=null) {
            current.next = list1;
        } else {
            current.next = list2;
        }
        return head.next;
    }
    public ListNode mergeKLists(List<ListNode> lists) {
        if(lists==null||lists.size()==0) {
            return null;
        }
        ListNode head = lists.get(0);
        for(int i=1;i<lists.size();i++) {
            head = mergeTwoLists(head, lists.get(i));
        }
        return head;
    }
}

上面的方法TLE了,上网查了一下注意到通过使用归并排序算法可将链表排序的时间复杂度缩减到的O(NlgN)。详细的计算公式就是:

所以借鉴归并排序的方法,自顶向下,先递归的对链表的前半部分和后半部分进行归并排序,最后再merge。

下面代码顺利AC了,时间复杂度为:O(NlogK)

public class Solution {
    ListNode merge2Lists(ListNode list1, ListNode list2) {
        ListNode head    = new ListNode(-1);
        ListNode current = head;
        while(list1!=null&&list2!=null) {
            if(list1.val<list2.val) {
                current.next = list1;
                list1   = list1.next;
            } else {
                current.next = list2;
                list2   = list2.next;
            }
            current = current.next;
        }
        if(list1!=null) {
            current.next = list1;
        } else {
            current.next = list2;
        }
        return head.next;
    }
    public ListNode mergeKLists(List<ListNode> lists) {
        if(lists==null||lists.size()==0) {
            return null;
        }
        if(lists.size()==1) {
            return lists.get(0);
        }
        int length = lists.size() ;
        int mid = (length - 1)/2 ;
        ListNode l1 = mergeKLists(lists.subList(0,mid + 1)) ;
        ListNode l2 = mergeKLists(lists.subList(mid + 1,length)) ;

        return merge2Lists(l1,l2) ;
    }
}

版权声明:本文博主原创文章,博客,未经同意不得转载。

时间: 2024-12-25 13:28:15

LeetCode Merge k Sorted Lists 解决报告的相关文章

LeetCode: Merge k Sorted Lists 解题报告

Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. Show Tags 参考资料: http://blog.csdn.net/linhuanmars/article/details/19899259. SOLUTION 1: 使用分治法.左右分别递归调用Merge K sorted List,然后再使用merg

[leetcode]Merge k Sorted Lists @ Python

原题地址:https://oj.leetcode.com/problems/merge-k-sorted-lists/ 题意:Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 解题思路:归并k个已经排好序的链表.使用堆这一数据结构,首先将每条链表的头节点进入堆中,然后将最小的弹出,并将最小的节点这条链表的下一个节点入堆,依次类推,最终形成的链表就是归

LeetCode: Merge k Sorted Lists [022]

[题目] Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. [题意] 合并K个有序链表 [思路] 归并 [代码] /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), n

【LeetCode】Merge k Sorted Lists 解题报告

[题目] Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 合并几个有序链表为一个,分析算法复杂度. [分治] 直观的想法是两两合并,有两种方法:1)list1和list2合并为newlist2,newlist2再和list3合并为newlist3,newlist3再和list4合并为newlist4--依次类推:2)list1和list2合并为li

[leetcode]Merge k Sorted Lists @ Python [基础知识: heap]

原题地址:https://oj.leetcode.com/problems/merge-k-sorted-lists/ 题意:Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 解题思路: 归并k个已经排好序的链表, 使用堆这一数据结构. 堆,也叫做:priority queue 首先将每条链表的头节点进入堆中. 然后将最小的弹出,并将最小的节点这条链

LeetCode -- Merge k Sorted Lists (Divide and Conquer / PriorityQueue)

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 分支策略:每次归并两个已排好序的链表,直至只剩下一个链表. public class Solution { public ListNode mergeKLists(List<ListNode> lists) { //处理特殊情况  if (lists == null)             ret

LeetCode Merge k Sorted Lists

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 1 /** 2 * Definition for singly-linked list. 3 * public class ListNode { 4 * int val; 5 * ListNode next; 6 * ListNode(int x) { 7 * val = x; 8 * next =

[Leetcode] Merge k sorted lists 合并k个已排序的链表

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 思路:这题最容易想到的是,(假设有k个链表)链表1.2合并,然后其结果12和3合并,以此类推,最后是123--k-1和k合并.至于两链表合并的过程见merge two sorted lists的分析.复杂度的分析见JustDoIT的博客.算法复杂度:假设每个链表的平均长度是n,则1.2合并,遍历2n个

LeetCode——Merge k Sorted Lists

Discription: Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. Subscribe to see which companies asked this question. 思路:其实就是归并排序的最后一步归并操作.思想是递归分治,先把一个大问题分成2个子问题,然后对2个子问题的解进行合并.经过一次遍历就能找出已经有序的序列.就算是题目中给