1. 程式人生 > >LeetCode 23 合併K個排序連結串列

LeetCode 23 合併K個排序連結串列

合併 k 個排序連結串列,返回合併後的排序連結串列。請分析和描述演算法的複雜度。

示例:

輸入:
[
  1->4->5,
  1->3->4,
  2->6
]
輸出: 1->1->2->3->4->4->5->6

解答:

複用LeetCode21合併兩個連結串列的程式碼,將連結串列0和連結串列1進行合併生成新的連結串列,然後再將新的連結串列與連結串列2合併,依次類推。

時間複雜度為m2nm^2*n,其中m代表連結串列的個數,n代表連結串列元素的個數。

**
 * Definition for singly-linked list.
* public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { if (l1 == null) return l2; if (l2 == null) return l1; ListNode listNode = new ListNode(0); ListNode head =
listNode; ListNode p = new ListNode(0); while (l1 != null && l2 != null) { if (l1.val <= l2.val) { listNode.next = l1; p = l1; l1 = l1.next; } else{ listNode.next = l2; p =
l2; l2 = l2.next; } listNode = listNode.next; } if (l1 == null) p.next = l2; if (l2 == null) p.next = l1; // l1 作為返回連結串列 return head.next; } public ListNode mergeKLists(ListNode[] lists) { int len = lists.length; if (len == 0) return null; if (len == 1) return lists[0]; for (int i = 1; i < len; i++){ lists[0] = mergeTwoLists(lists[0], lists[i]); } return lists[0]; } }

採用兩兩合併的方法,鄰近的兩個連結串列合併生成m/2個連結串列,再次兩兩合併,直至只剩下一個連結串列。時間複雜度為O(mlogmn)O(mlogm*n),其中m代表連結串列的個數,n代表連結串列元素的個數。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode mergeKLists(ListNode[] lists) {    
        if(lists ==null || lists.length == 0){
            return null;
        }
        
        return sort(lists,0,lists.length-1);
    }
    
    public ListNode sort(ListNode[] lists , int lo ,int hi){
        if(lo >= hi){return lists[lo];}
        
        int mid = (hi-lo)/2+lo;
        ListNode l1 = sort(lists,lo,mid);
        ListNode l2 = sort(lists,mid+1,hi);
        
        return merge(l1,l2);
        
    }
    
    public ListNode merge(ListNode l1, ListNode l2) {

        ListNode h1 = l1;
        ListNode h2 = l2;

        ListNode res = new ListNode(0);

        ListNode head = res;


        while (h1 != null || h2 != null) {
            if (h1 == null || h2 == null) {
                head.next = h1 == null ? h2 : h1;
                break;
            }

            //如果h2大於或等於h1
            if (h1.val <= h2.val) {
                head.next = h1;
                h1 = h1.next;
                head = head.next;
            } else if (h1.val >= h2.val) {
                head.next = h2;
                h2 = h2.next;
                head = head.next;
            }
        }
        return res.next;
    }
}

相關推薦

leetcode 23合併K排序連結串列-----python

合併 k 個排序連結串列,返回合併後的排序連結串列。請分析和描述演算法的複雜度。 示例: 輸入: [ 1->4->5, 1->3->4, 2->6 ] 輸出: 1->1->2->3->4->4->5->6 思

leetcode 23. 合併K排序連結串列 C#

合併K個排序連結串列 Merge K Sorted Lists 思路 分治法,把k個連結串列不停的分成兩份,直到其中一份為2個連結串列或一個連結串列。2個連結串列就把這兩個連結串列合併,返回合併的連結串列。 程式碼 /** *

Leetcode(23)合併K排序連結串列

題目描述 合併 k 個排序連結串列,返回合併後的排序連結串列。請分析和描述演算法的複雜度。 示例: 輸入: [ 1->4->5, 1->3->4, 2->6 ] 輸出: 1->1->2->3->4->4->5->6 解題

LeetCode-23. 合併K排序連結串列

題目地址:https://leetcode-cn.com/problems/merge-k-sorted-lists/ 思路:歸併處理,兩兩合併,複雜度 O(log(k)*max(N)),N為連結串列長度 /** * Definition for singly-linked lis

LeetCode 23 ——合併 K 排序連結串列

1. 題目 2. 解答 2.1. 方法一 在 合併兩個有序連結串列 的基礎上,我們很容易想到第一種解法,首先我們將第一個連結串列和第二個連結串列合併成一個新的連結串列,然後再往後依次合併接下來的每個連結串列即可。 假設每個連結串列結點數一樣都為 n,第一次合併時,要遍歷 2n 個結點,往後則要分別遍歷 3

LeetCode 23 合併K排序連結串列

合併 k 個排序連結串列,返回合併後的排序連結串列。請分析和描述演算法的複雜度。 示例: 輸入: [ 1->4->5, 1->3->4, 2->6 ] 輸出:

Leetcode 23:合併K排序連結串列(最詳細的解法!!!)

合併 k 個排序連結串列,返回合併後的排序連結串列。請分析和描述演算法的複雜度。 示例: 輸入: [ 1->4->5, 1->3->4, 2->6 ] 輸出: 1->1->2->3->4-

leetcode 23. 合併K排序連結串列

題目描述:合併 k 個排序連結串列,返回合併後的排序連結串列。請分析和描述演算法的複雜度。示例:輸入: [   1->4->5,   1->3->4,   2->6 ] 輸

Leetcode做題日記:23. 合併K排序連結串列(PYTHON)

合併 k 個排序連結串列,返回合併後的排序連結串列。請分析和描述演算法的複雜度。 示例: 輸入: [ 1->4->5, 1->3->4, 2->6 ] 輸出: 1->1->2->3->4->4->5->6

23. 合併K排序連結串列

合併 k 個排序連結串列,返回合併後的排序連結串列。請分析和描述演算法的複雜度。 示例: 輸入: [ 1->4->5, 1->3->4, 2->6 ] 輸出:

23合併K排序連結串列

合併 k 個排序連結串列,返回合併後的排序連結串列。請分析和描述演算法的複雜度。 示例: 輸入: [   1->4->5,   1->3->4,   2->6 ]

21. 合併有序連結串列/23. 合併K排序連結串列

1.合併兩個有序連結串列 ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { ListNode* Phead = new ListNode(0); ListNode* l3 = Phead; while

23. 合併K排序連結串列 java 23

合併 k 個排序連結串列,返回合併後的排序連結串列。請分析和描述演算法的複雜度。 示例: 輸入: [   1->4->5,   1->3->4,   2->6 ] 輸出: 1->1->2->3->4->4->

leetCode 23. Merge k Sorted Lists (合併k排序連結串列) 解題思路和方法

Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 思路:此題是由合併兩個排序連結串

[LeetCode]23. Merge k Sorted Lists合併K排序連結串列

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. Example: Input: [   1->4->5, &nb

leetcode題庫——合併k排序連結串列

題目描述: 合併 k 個排序連結串列,返回合併後的排序連結串列。請分析和描述演算法的複雜度。 示例: 輸入: [   1->4->5,   1->3->4,   2->6 ] 輸出: 1->1-&g

LeetCode23 合併k有序連結串列

解題思路: 1 之前的某道題有將兩個有序連結串列排序的解法,思路很簡單,可以拿來直接用。 2 利用分治的思想,分根據下標來分;兩兩合併,再兩兩合併…以此類推。 程式碼: /** * Definition for singly-linked list. * public

21 合併有序連結串列 merge two sorted lists &&23 合併k有序連結串列 merge k sorted lists

1. /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; }

LeetCode23.合併K排序連結串列 python3

合併 k 個排序連結串列,返回合併後的排序連結串列。請分析和描述演算法的複雜度。 示例: 輸入: [ 1->4->5, 1->3->4, 2->6 ] 輸出:

21 合併有序連結串列 merge two sorted lists &&23 合併k有序連結串列 merge k sorted lists

1. /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) {