LeetCode OJ算法题(二十二):Merge k Sorted Lists

题目:

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

解法:

对k个有序数组进行组合,第一反应就是归并排序。

所谓归并排序就是对一数组两两分组后排序,再把这n/2个有序数组两两组合,排序后得n/4个有序数组,以此类推,直到全部何为一个数组为止。

对于链表也一样,先两个两个的进行融合,逐层向上,因此可以使用递归,当Lists为空,或者Lists只有一个元素时,停止递归。

算法的主要工作是对两个有序表进行融合,可以各设一个指针,小的数加入新的表,指针++,直到循环到链表为空。

import java.util.ArrayList;
import java.util.List;


public class No22_MergeKSortedLists {
	 public static class ListNode {
		 int val;
		 ListNode next;
		 ListNode(int x) {
			 val = x;
			 next = null;
		 }
	 }
	public static void main(String[] args){
		ListNode a11 = new ListNode(1);
		ListNode a12 = new ListNode(3);
		ListNode a13 = new ListNode(5);
		a11.next = a12;
		a12.next = a13;
		ListNode b11 = new ListNode(2);
		ListNode b12 = new ListNode(4);
		ListNode b13 = new ListNode(6);
		b11.next = b12;
		b12.next = b13;
		ListNode c11 = new ListNode(3);
		ListNode c12 = new ListNode(6);
		ListNode c13 = new ListNode(9);
		c11.next = c12;
		c12.next = c13;
		List<ListNode> list = new ArrayList<No22_MergeKSortedLists.ListNode>();
		list.add(a11);
		list.add(b11);
		list.add(c11);
		ListNode p = mergeKLists(list);
		while(p!=null){
			System.out.println(p.val);
			p = p.next;
		}
	}

	public static ListNode mergeKLists(List<ListNode> lists) {
		int size = lists.size();
		if(size == 0) return null;
		if(size == 1) return lists.get(0);
		ListNode head = new ListNode(0);
		ListNode node = head;
		ListNode first = mergeKLists(lists.subList(0, size/2));
		ListNode second = mergeKLists(lists.subList(size/2, size));
		while(first!=null && second!=null){
			if(first.val < second.val){
				node.next = first;
				first = first.next;
				node = node.next;
				continue;
			}
			else{
				node.next = second;
				second = second.next;
				node = node.next;
				continue;
			}
		}
		if(first == null){
			node.next = second;
		}
		else{
			node.next = first;
		}
		return head.next;
    }
	
	
//	public static ListNode mergeKLists(List<ListNode> lists) {
//	if(lists.size() == 0) 
//		return null;
//	if(lists.size() == 1)
//		return lists.get(0);
//	ListNode head = new ListNode(0);
//	ListNode node = head;
//	while(true){
//		int index = 0;
//		for(int i=0;i<lists.size();i++){
//			if(lists.get(i) == null)
//				continue;
//			if(lists.get(index) == null || lists.get(index).val > lists.get(i).val)
//				index = i;
//		}
//		node.next = lists.get(index);
//		node = node.next;
//		if(lists.get(index) == null ) break;
//		lists.set(index, lists.get(index).next);
//		int nullcount = 0;
//		for(int i=0;i<lists.size();i++){
//			if(lists.get(i) == null) 
//				nullcount++;
//		}
//		if(nullcount == lists.size())
//			break;
//	}
//    return head.next;
//}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值