È una possibilità. Ma solo una delle soluzioni realizzabili. E comunque devi valutare in base a quello che ti è stato chiesto. Perché per me, avere i due set delle parole da f1 e f2 ordinati alfabeticamente, di per sé non serve a niente. Ma se ti è stato chiesto espressamente un motivo forse (?) c'è.
Per questo dicevo che basterebbero due HashSet per applicare velocemente la logica ("appartenenti ad f1 ma non ad f2").
Ma si potrebbe anche fare ben diversamente: per f1 un TreeSet con il Comparator specifico (leggi sotto) e per f2 un HashSet (perché devi cercare velocemente). Iteri sul TreeSet per f1, se trovi la parola nel HashSet per f2, la puoi eliminare dal TreeSet. Alla fine hai già il set risultante e già ordinato come chiesto.
Insomma, ci sono diversi approcci.
A fronte della precisazione:
L'elenco su output deve risultare ordinato per lunghezza crescente di parola e a parita' di lunghezza in ordine alfabetico.
La risposta è sì, in un qualche modo (o per un TreeSet o per ordinare una lista) devi usare una apposita implementazione di Comparator (scritta da te), perché il criterio di ordinamento è molto particolare: per lunghezza e poi per ordine alfabetico.