题解 | #合并k个已排序的链表#

合并k个已排序的链表

https://www.nowcoder.com/practice/65cfde9e5b9b4cf2b6bafa5f3ef33fa6

1、找中间值,把传入的集合链表分为左右俩部分

2、递归二分这个集合,最后,会得到一个元素不能再分。

3、再利用俩个链表顺序合并的方法,把第一个和第二个不能再分的链表合并,并依次三个和第四个合并。。。

4、最后就得到了k个已排序的链表合并结果。

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {

    public ListNode mergeKLists (ArrayList<ListNode> lists) {
        // write code here
        return mergeKList(lists, 0, lists.size() - 1);
    }

    public ListNode mergeKList(ArrayList<ListNode> lists, int left,int right){
	// 递归终点
        if(left == right){
            return lists.get(left);
        }
        if(left > right){
            return null;
        }
	// 取中间值 >> 1 右移1位表示 / 2^1 
        int mid = left + ((right - left) >> 1);
	// 递归调用到最基础的俩俩合并
	// 分治左右,实现list中的节点元素可以呈树形俩俩合并,实现logn,配合俩俩合并,总时间复杂度nlogn
        return merge(mergeKList(lists,left,mid),mergeKList(lists,mid+1,right));
    }

  
  
    // 俩个链表合并 (基础)
    public ListNode merge(ListNode l1, ListNode l2){
        if(l1 == null || l2 == null){
            return l1 == null ? l2 : l1;
        }
	// 返回节点
        ListNode dummy = new ListNode(-1);
	// 操作节点
        ListNode cur = dummy;
        while(l1 != null && l2 != null){
            if(l1.val < l2.val){
                cur.next = l1;
                l1 = l1.next;
            }else{
                cur.next = l2;
                l2 = l2.next;
            }
            cur = cur.next;
        }
	// 补齐剩下未合并完的链
        cur.next = (l1 == null ? l2 : l1);
        return dummy.next;
    }
}

#链表合并#
全部评论

相关推荐

头像
昨天 14:28
长沙理工大学
刷算法真的是提升代码能力最快的方法吗?&nbsp;刷算法真的是提升代码能力最快的方法吗?
牛牛不会牛泪:看你想提升什么,代码能力太宽泛了,是想提升算法能力还是工程能力? 工程能力做项目找实习,算法也分数据结构算法题和深度学习之类算法
点赞 评论 收藏
分享
10-29 15:38
门头沟学院 Java
榕城小榕树:难道你简历里写了配送路径优化算法?
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务