import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.PriorityQueue;

class SuperIterator<T extends Comparable<T>> implements Iterator<T> {
    
    private List<Iterator<T>> iters;
    private PriorityQueue<T> queue = new PriorityQueue<>();
    
    public static void main (String[] args) throws java.lang.Exception {
    	// Test
        Iterator<Integer> iter1 = Arrays.asList(1, 5).iterator();
        Iterator<Integer> iter2 = Arrays.asList(2, 4).iterator();
        Iterator<Integer> iter3 = Arrays.asList(1, 2, 4, 5).iterator();
        
        SuperIterator<Integer> superIter = new SuperIterator<>(iter1, iter2, iter3);
        while (superIter.hasNext()) {
            System.out.println(superIter.next());
        }
    }
 
    public SuperIterator(Collection<Iterator<T>> iters) {
      this.iters = new ArrayList<>(iters);
    }
    
    public SuperIterator(Iterator<T>... iters) {
      this.iters = new ArrayList<>(Arrays.asList(iters));
    }

    @Override
    public boolean hasNext() {
        return !(iters.isEmpty() && queue.isEmpty());     
    }

    @Override
    public T next() {
        iters.removeIf(i -> !i.hasNext());
        iters.forEach(i -> queue.add(i.next()));
        if (queue.isEmpty()) {
            throw new NoSuchElementException();
        }
        return queue.poll();
    }  
}