maneira eficiente de fazer 'contém' entre duas listas

Tenho 2 listas de números inteiros,

l1 = new ArrayList();
l2 = new ArrayList();

Quero descobrir itens duplicados em ambos, tenho a minha abordagem usual: -

for (Integer i : l1)
{
 if(l2.contains(i)){
    System.out.println("Found!");
  } 
}

Eu ouvicontains() éO(n), fazendo minha implementaçãoO(n^2).

Existe uma maneira melhor de fazer isso (menos deO(n^2))?

questionAnswers(2)

yourAnswerToTheQuestion