题解 | #合并k个已排序的链表# 分治策略+多路递归

合并k个已排序的链表

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

import java.util.*;

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

public class Solution {
    /**
     * 思路:分治策略+多路递归
     *		将链表集合根据索引拆分两部分,递归进行不断拆分两部分链表,直到拆分到两部分都只剩一个链表
	 *		这时可以合并两个链表,最后返回的就是多个链表合并后的结果
     * 
     * @param lists ListNode类ArrayList 
     * @return ListNode类
     */
    public ListNode mergeKLists (ArrayList<ListNode> lists) {
        if(lists.size() == 0){
            return null;
        }
        return split(lists,0,lists.size() - 1 );
    }
    public ListNode split(ArrayList<ListNode> lists, int i, int j){
	  	//治
        if(i == j){
            return lists.get(i);
        }
	  	//分
        int m = (i + j) >>> 1; //中间索引
        ListNode p1 = split(lists,i,m);
        ListNode p2 = split(lists,m+1,j);
	  	//合
        return merge(p1,p2);

    }
  	//合并两个链表
    public ListNode merge(ListNode p1, ListNode p2){
        if(p1 == null){
            return p2;
        }
        if(p2 == null){
            return p1;
        }
        if(p1.val < p2.val){
            p1.next = merge(p1.next,p2);
            return p1;
        }else{
            p2.next = merge(p1,p2.next);
            return p2;
        }
    }
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
06-29 17:30
点赞 评论 收藏
分享
自学java狠狠赚一...:骗你点star的,港卵公司,记得把star收回去
点赞 评论 收藏
分享
矫健的闭门羹烹饪师又...:本人双非本,在鹅厂测开实习,你这个简历上写的这两个项目的技术栈都差不多,能够让面试官去延伸去问的八股除了redis就再没啥了,建议项目这边可以再改改,然后专业技能那块的话,感觉linux和测试工具可以分开写,毕竟不是干一件事的,反正没实习的基础上面试就深挖项目和八股,好好卷吧
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务