code: private static void mergeReversed(List<String> merged,
  	                                  final List<String> other) {
  
  		if(other.isEmpty())
  			return;
  
  		if(merged.isEmpty()) {
  			merged.addAll(other);
  			return;
  		}
  
  		ListIterator<String> m = merged.listIterator();
  		ListIterator<String> o = other.listIterator();
  
  		String nextM, prevO;
  		prevO = o.next();
  		while(m.hasNext()) {
  			// peek at m
  			nextM = m.next();
  			m.previous();
  
  			//insert from O until exhausted or occurs after nextM
  			while(prevO.compareTo(nextM) > 0) {
  				m.add(prevO);
  				if(!o.hasNext()) {
  					return;
  				}
  				prevO = o.next();
  			}
  			//remove duplicates
  			if(prevO.equals(nextM)) {
  				if(!o.hasNext()) {
  					return;
  				}
  				prevO = o.next();
  			}
  
  			m.next();
  		}
  		m.add(prevO);
  		while(o.hasNext()) {
  			m.add(o.next());
  		}
  
  	}
docs: Takes two reverse sorted lists of strings and merges the second into the
  first. Duplicates are removed.
  
  @param merged A reverse sorted list. Modified by this method to contain
  the contents of other.
  @param other A reverse sorted list. Not modified.