LeetCode(23):合并K个排序链表 Merge k Sorted Lists(Java)

234 篇文章 1 订阅
177 篇文章 0 订阅

2019.6.7 #程序员笔试必备# LeetCode 从零单刷个人笔记整理(持续更新)

合并两个有序链表可以很容易地想到归并排序的方法。合并K个有序链表需要分治+归并,对K个链表进行分治,对分治后的链表两两归并排序即可。


传送门:合并K个排序链表

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。

示例:
输入:
[
  1->4->5,
  1->3->4,
  2->6
]
输出: 1->1->2->3->4->4->5->6


/**
 * 
 * @author ChopinXBP
 * Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
 * 合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
 *
 */

public class MergekSortedLists {


	public class ListNode {
		int val;
		ListNode next;

		ListNode(int x) {
			val = x;
		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

    public ListNode mergeKLists(ListNode[] lists) {
        if(lists == null || lists.length == 0) return null;
        
        return mergeSolution(lists, 0, lists.length - 1);
    }
    
    public ListNode mergeSolution(ListNode[] lists, int begin, int end) {
    	if(begin == end) {
    		return lists[begin];
    	}else {
    		int mid = (begin + end) >> 1;
    		ListNode l1 = mergeSolution(lists, begin, mid);
    		ListNode l2 = mergeSolution(lists, mid + 1, end);
    		return mergeTwoLists(l1, l2);
    	}
    }
    
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
    	if(l1 == null && l2 == null)return null;
    	if(l1 == null) return l2;
    	if(l2 == null) return l1;
    	
    	ListNode result = new ListNode(-1);
    	ListNode p = result;
    	ListNode pl1 = l1;
    	ListNode pl2 = l2;
    	while(pl1 != null && pl2 != null) {
    		if(pl1.val < pl2.val) {
    			p.next = pl1;
    			pl1 = pl1.next;
    		}else {
    			p.next = pl2;
    			pl2 = pl2.next;
    		}
    		p = p.next;
    	}
    	
    	if(pl1 == null) {
    		p.next = pl2;
    	}
    	if(pl2 == null) {
    		p.next = pl1;
    	}
    	
    	return result.next;
    }
}



#Coding一小时,Copying一秒钟。留个言点个赞呗,谢谢你#

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值