3
respostas

Outra Solução

O meu código fiz dessa forma. Acredito que tenha ficado mais simples

function juntaOrganiza(listaUm, listaDois) {
    let lista = [];
    let i = j = 0;

    while (i < listaUm.length || j < listaDois.length) {

        if (i < listaUm.length && listaUm[i].preco < listaDois[j].preco) {
            lista.push(listaUm[i++]);
        }
        else {
            lista.push(listaDois[j++]);
        }
    }

    return lista;
}
3 respostas

Oi, Carlos, tudo bem?

No código da aula, após o laço while principal, foram adicionados mais dois laços while. Esses são responsáveis por verificar se ainda há elementos remanescentes em qualquer uma das duas listas após o término do laço principal. Se houver, esses elementos são adicionados à lista final. Essa parte é importante porque, em alguns casos, uma das listas pode ter mais elementos do que a outra.

No seu código, você está verificando se ainda há elementos em ambas as listas dentro do mesmo laço while. Isso pode causar um problema quando uma das listas terminar antes da outra, porque a condição listaUm[i].preco < listaDois[j].preco pode tentar acessar um elemento que não existe (quando i ou j ultrapassarem o tamanho da lista correspondente), o que resultará em um erro.

Para solucionar isso, você pode adicionar condições extras para verificar se i ou j ultrapassaram o tamanho de suas listas correspondentes. Aqui está um exemplo de como você pode fazer isso:

function juntaOrganiza(listaUm, listaDois) {
    let lista = [];
    let i = 0, j = 0;

    while (i < listaUm.length || j < listaDois.length) {
        if (i < listaUm.length && j < listaDois.length) {
            if (listaUm[i].preco < listaDois[j].preco) {
                lista.push(listaUm[i++]);
            }
            else {
                lista.push(listaDois[j++]);
            }
        } else if (i < listaUm.length) {
            lista.push(listaUm[i++]);
        } else {
            lista.push(listaDois[j++]);
        }
    }

    return lista;
}

Nesse código, adicionamos uma condição extra para verificar se i ou j ultrapassaram o tamanho de suas listas correspondentes. Se i ainda estiver dentro do tamanho de listaUm e j ainda estiver dentro do tamanho de listaDois, ele compara os preços e adiciona o menor à lista. Se i ainda estiver dentro do tamanho de listaUm mas j já tiver ultrapassado o tamanho de listaDois, ele adiciona o elemento de listaUm à lista. O mesmo acontece se j ainda estiver dentro do tamanho de listaDois mas i já tiver ultrapassado o tamanho de listaUm.

Espero ter ajudado. Caso tenha dúvidas, conte com o fórum. Abraços!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Obrigado pelo retorno!

Fiz uma outra versão do código. Fiz os testes aqui e aparentemente funciona bem em todas as situações, gostaria de saber se está correto. OBS: Fiz uma função que organiza duas listas de números, não de objetos como foi feito na aula, assim ficou mais fácil para fazer os testes.

function juntaOrganiza(listaUm, listaDois) {
    let lista = [];
    let i = j = 0;

    while (i < listaUm.length || j < listaDois.length) {

        if ( j >= listaDois.length || listaUm[i] < listaDois[j]) {
            lista.push(listaUm[i++]);
        }
        else {
            lista.push(listaDois[j++]);
        }
    }
    return lista;
}

Oi, Carlos, tudo bem?

Parabéns pelo resultado na resolução do desafio, ficou ótimo!

Também agradeço por compartilhar seu código com os demais estudantes, com certeza vai ajudar nos estudos de todas as pessoas que estão aprendendo este mesmo assunto.

Continue mergulhando em tecnologia e se tiver dúvidas, conte com o fórum. Abraços!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software