merge k sorted list with iterator

本文介绍了一种实现合并K个已排序整数列表的方法,通过使用Java中的优先队列来按顺序输出所有元素。具体实现了MergeKListIterator类,构造函数接收多个列表并初始化优先队列,hasNext()方法检查是否还有更多元素,next()方法返回下一个最小元素。

Given k sorted lists of O(n) integers each, implement an iterator that will yield all elements in sorted order。

package list;

import java.util.*;

class Wrapper {
	public ArrayList<Integer> list;
	public int index;

	public Wrapper(ArrayList<Integer> list, int index) {
		this.list = list;
		this.index = index;
	}
}

public class MergeKListIterator {
	PriorityQueue<Wrapper> queue;

	public MergeKListIterator(ArrayList<ArrayList<Integer>> lists) {
		queue = new PriorityQueue<Wrapper>(10, new Comparator<Wrapper>() {
			@Override
			public int compare(Wrapper w1, Wrapper w2) {
				return w1.list.get(w1.index) - w2.list.get(w2.index);
			}
		});

		for (ArrayList<Integer> list : lists) {
			Wrapper w = new Wrapper(list, 0);
			queue.offer(w);
		}
	}

	public boolean hasNext() {
		if (!queue.isEmpty())
			return true;

		return false;
	}

	public Integer next() {

		Wrapper w = queue.poll();

		ArrayList<Integer> list = w.list;
		int index = w.index;

		if (index < list.size() - 1) {
			w.index = index + 1;
			queue.offer(w);
		}

		return list.get(index);
	}

	public static void main(String[] args) {

		ArrayList<Integer> l1 = new ArrayList<Integer>();
		ArrayList<Integer> l2 = new ArrayList<Integer>();
		ArrayList<Integer> l3 = new ArrayList<Integer>();

		l1.add(2);
		l1.add(4);
		l1.add(6);
		l2.add(1);
		l2.add(3);
		l3.add(5);

		ArrayList<ArrayList<Integer>> lists = new ArrayList<ArrayList<Integer>>();
		lists.add(l1);
		lists.add(l2);
		lists.add(l3);

		MergeKListIterator mk = new MergeKListIterator(lists);
		while (mk.hasNext()) {
			System.out.println(mk.next());
		}
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值