private <T> List<T> merge(List<T> vetor1, List<T> vetor2, Comparator<T> comparator) 
    {
        if (vetor1 == null || vetor1.isEmpty()) 
        {
            return vetor2;
        }

        if (vetor2 == null || vetor2.isEmpty())
        {
            return vetor1;
        }

        //Iterador dos vetores
        int it1 = 0;
        int it2 = 0;
        
        //Tamanho do vetor
        final int TAM1 = vetor1.size();
        final int TAM2 = vetor2.size();
        
        //Lista que será a união dos dois vetores
        ArrayList<T> merged = new ArrayList<>();
        
        //String a ser inserida
        T st1;
        T st2;

        while (it1 < TAM1 && it2 < TAM2) 
        {
            st1 = vetor1.get(it1);
            st2 = vetor2.get(it2);
            int compare = comparator.compare(st1, st2);
            
            if (compare >= 0) 
            {
                merged.add(st2);
                it2++;
            } 
            else 
            {
                merged.add(st1);
                it1++;
            }
        }

        while (it1 < TAM1) 
        {
            st1 = vetor1.get(it1);
            merged.add(st1);
            it1++;
        }

        while (it2 < TAM2) 
        {
            st2 = vetor2.get(it2);
            merged.add(st2);
            it2++;
        }

        return merged;
    }