[路飞]_小白算法学习之合并链表~

111 阅读1分钟

合并两个有序的链表

因为提供的是有序的链表,所以只需要按顺序的一一分别对比两个链表的各个节点,如下图

合并两个有序链表.png 代码如下:

var mergeTwoLists = function(l1, l2) {
    let result = new ListNode(0)
    let pre = result
    while( l1 !== null && l2 !== null){
        if( l1.val < l2.val){
            pre.next = l1
            l1 = l1.next
        }else{
            pre.next = l2
            l2 = l2.next
        }
        pre =  pre.next
    }
    
     // 如上图中,最后C链表还没有完全合并两个链表的节点就退出了循环,所以还需要判断最后哪个链表的节点还没为null
    pre.next = l1 === null ? l2 : l1 
    return result.next
}

合并K个有序链表

解法:1:与合并两个有序链表的解法可以是一样的,代码如下:

 var mergeKLists = function(lists) {
     let res = null;

    for(let i = 0; i < lists.length; i++){
        // 循环K个链表 依次进行两个链表的合并
        res = mergeTwoKLists(res,lists[i])
    }
     return res
};

var mergeTwoKLists =  (head1,head2)=>{

    let dummy = new ListNode(0),cur = dummy;

    while(head1 !== null && head2 !== null){
        if(head1.val < head2.val){
            cur.next = head1
            head1 = head1.next
        }else{
            cur.next = head2
            head2  = head2.next
        }

        cur  = cur.next
    }

    cur.next =  head2 || head1
    return dummy.next
}

解法2:K个链表的数据形式是一个二维数组,那就可以将数组扁平化之后取得每个链表中节点的val值,添加到新的数组中进行排序,最后在转换成链表中的节点输出

var mergeKLists = function(lists) {
    let  arr = []

    for(let i = 0; i < lists.length; i++){
        while(lists[i]){
            arr.push(lists[i].val)
            lists[i] = lists[i].next
        }
    }
    arr.sort((a,b)=>a-b)
    let dummy = new ListNode(0),cur = dummy;
    for(let i=0; i < arr.length; i++){
        cur.next = new ListNode(arr[i])
        cur  = cur.next
    }
    return dummy.next
};