leetcode题目 23. 合并K个排序链表

题目

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

示例

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

大体思路

使用分治的思想。

首先看两个链表的合并,

在这里插入图片描述
我们每次选择较小的头元素,直到选完为止。

下一步:

在这里插入图片描述
在这里插入图片描述
以下省略…

两个链表合并的代码

public ListNode mergeTwoLists(ListNode l1,ListNode l2){
		 if(l1==null) return l2;
		 if(l2==null) return l1;
		 if(l1.val<l2.val){
			 l1.next=mergeTwoLists(l1.next, l2);
			 return l1;
		 }else{
			 l2.next=mergeTwoLists(l1, l2.next);
			 return l2;
		 }
	 }

K项合并

k路归并,相信学过数据结构的人都很好理解归并思想。
在这里插入图片描述
归并采用递归的思想,先把所有元素分为单个元素,然后逐次合并,向上返回,最总合并为一个总的链表。分治不外乎就是分和治两个过程,而治其实就是merge的过程。

分治代码(包括了上面的代码)

public class problem23 {
	 //Definition for singly-linked list.
	 public static class ListNode {
	     int val;
	     ListNode next;
	     ListNode(int x) { val = x; }
	 }
	 public ListNode mergeKLists(ListNode[] lists) {
		 if(lists==null||lists.length==0) return null;//为空时的特判
		 return merge(lists,0,lists.length-1);
	 }
	 public ListNode merge(ListNode[] lists,int left,int right){
		 if(left==right) return lists[left];
		 int mid=left+(right-left)/2;
		 ListNode l1=merge(lists,left,mid);
		 ListNode l2=merge(lists,mid+1,right);
		 return mergeTwoLists(l1,l2);
	 }
	 public ListNode mergeTwoLists(ListNode l1,ListNode l2){
		 if(l1==null) return l2;
		 if(l2==null) return l1;
		 if(l1.val<l2.val){
			 l1.next=mergeTwoLists(l1.next, l2);
			 return l1;
		 }else{
			 l2.next=mergeTwoLists(l1, l2.next);
			 return l2;
		 }
	 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值