[leetcode-JavaScript]---2三、合併K個排序鏈表

題目

合併 k 個排序鏈表,返回合併後的排序鏈表javascript

示例:java

輸入:
    [
      1->4->5,
      1->3->4,
      2->6
    ]
    輸出: 1->1->2->3->4->4->5->6
複製代碼

思考

以前作過合併兩個有序鏈表,這道題增長難度,合併k個有序鏈表,基本上也是兩兩合併。 採用分治法,簡單來講就是不停的對半劃分,好比k個鏈表先劃分爲合併兩個k/2個鏈表的任務,再不停的往下劃分,直到劃分紅只有一個或兩個鏈表的任務,開始合併。bash

代碼中的k是經過 (len+1)/2 計算的,這裏爲啥要加1呢,這是爲了當len爲奇數的時候,k能始終從後半段開始,好比當len=5時,那麼此時k=3,則0和3合併,1和4合併,最中間的2空出來。當len是偶數的時候,加1也不會有影響,好比當len=4時,此時k=2,那麼0和2合併,1和3合併app

解決方法

/*
 * @lc app=leetcode.cn id=23 lang=javascript
 *
 * [23] 合併K個排序鏈表
 */
/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode[]} lists
 * @return {ListNode}
 */
var mergeKLists = function(lists) {
    let len=lists.length;
    if(len===0){
        return null
    }
    if(len===1){
        return lists[0]
    }
    while(len>1){
        let k=parseInt((len+1)/2)
        for(let i=0;i<parseInt(len/2);i++){
            lists[i]=mergeTwoLists(lists[i],lists[i+k])
        }
        len=k;
    }
    return lists[0]
};
/**
* 合併兩個有序鏈表
*/
var mergeTwoLists = function(l1, l2) {
    if(l1===null){
        return l2;
    }else 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
    }
};
複製代碼

說明

相關文章
相關標籤/搜索