Given a list of k sorted iterators. Implement MergingIterator to merge them. If you are not familiar with Iterators check similar questions.
class MergingIterator implements Iterator<Integer> {
public MergingIterator(List<Iterator<Integer>> iterators) {
}
public boolean hasNext() {
}
public Integer next() {
}
}Example:
MergingIterator itr = new MergingIterator([[2, 5, 9], [], [4, 10]]);
itr.hasNext(); // true
itr.next(); // 2
itr.next(); // 4
itr.next(); // 5
itr.next(); // 9
itr.next(); // 10
itr.hasNext(); // false
itr.next(); // errorJava solution using PriorityQueue and PeekingIterator: https://leetcode.com/playground/Eu9epFf5
class MergingIterator implements Iterator<Integer> {
private final Queue<PeekingIterator> queue;
public MergingIterator(List<Iterator<Integer>> iterators) {
queue = new PriorityQueue<>(iterators.size(), (i1, i2) -> Integer.compare(i1.peek(), i2.peek()));
for (Iterator<Integer> iterator : iterators) {
if (iterator.hasNext()) {
queue.add(new PeekingIterator(iterator));
}
}
}
public boolean hasNext() {
return !queue.isEmpty();
}
public Integer next() {
PeekingIterator nextIter = queue.remove();
Integer next = nextIter.next();
if (nextIter.hasNext()) {
queue.add(nextIter);
}
return next;
}
}Related problems: