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

23.合併K個生序連結串列

23.合併K個生序連結串列

題目

給你一個連結串列陣列,每個連結串列都已經按升序排列。

請你將所有連結串列合併到一個升序連結串列中,返回合併後的連結串列。

用例

輸入:lists = [[1,4,5],[1,3,4],[2,6]]
輸出:[1,1,2,3,4,4,5,6]
解釋:連結串列陣列如下:
[
  1->4->5,
  1->3->4,
  2->6
]
將它們合併到一個有序連結串列中得到。
1->1->2->3->4->4->5->6
輸入:lists = []
輸出:[]
輸入:lists = [[]]
輸出:[]

求解

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode[]} lists
 * @return {ListNode}
 */
var mergeKLists = function(lists) {
    let len = lists.length;
    let res = null;
    let flag = [];
    let true_num = 0;
    let p=null;

    for(let i =0; i<len; i++){
        if(lists[i]!=null){
           flag.push(true) 
           true_num++
        }else{
            flag.push(false)
        }
    }
    while(true_num>0){
        let min_node = null
        let min = null;
        for(let j = 0;j<len;j++){
            //連結串列還有節點,就繼續
            if(flag[j]==true){
                if(min_node == null){
                    min_node = lists[j]
                    min = j
                }else{
                    if(min_node.val>lists[j].val){
                        min_node = lists[j]
                        min = j
                    }
                }
            }
        }
        if(res == null){
            res = min_node;
            p=res;
            lists[min] = lists[min].next;
            if(lists[min]==null){
                flag[min] = false
                true_num--
            }
        }else{
            p.next=min_node;
            p = p.next;
            lists[min] = lists[min].next;
            if(lists[min]==null){
                flag[min] = false
                true_num--
            }
        }
    }
    return res
}