Se il problema è trovare il primo elemento della lista L1 che è anche contenuto in L2, scorrere gli elementi di L1 uno alla volta e controllare se l'elemento corrente è in L2. Il secondo test ("è un elemento in L2") può essere fatto da un semplice ciclo su tutti gli elementi in L2. Oppure metti prima tutti gli elementi di L2 in un hashset, il che può velocizzare il processo in modo equo.
Ora dovrebbe essere ovvio che puoi cambiare i ruoli di L1 e L2 quando stai cercando il primo elemento in L2 che è anche parte di L1. E se stai cercando un elemento comune da uno degli elenchi che ha l'indice posizionale più basso in L1 o L2, esegui entrambi i passaggi descritti finora, e se trovi due elementi diversi, scegli quello con l'indice più basso in entrambi L1 o L2.
Questo approccio ha uno svantaggio: se L1 e L2 sono enormi, e hai alcuni elementi non comuni all'inizio di ogni lista, devi leggere l'elenco completo L1, L2 o entrambi, anche quando ci sono alcuni elementi comuni tra i primi elementi di L1 e L2. Quindi l'idea della tua soluzione sopra è quella di utilizzare i seguenti sottoinsiemi:
K1(n)="the first n elements of L1" (or L1 if n>length(L1))
K2(n)="the first n elements of L2" (or L2 if n>length(L2))
con n che va da 1 a max(length(L1),length(L2)
e controlla se K1 e K2 hanno un elemento comune, per ogni n. Il più piccolo n dove K1 (n) e K2 (n) hanno elementi comuni mostra che l'n-esimo elemento di L1 o l'n-esimo elemento di L2 è l'elemento che stai cercando.
Dovrebbe essere ovvio che quando K1 (n) e K2 (n) sono disgiunti, e stai andando da n a n + 1, devi solo controllare se i nuovi elementi di n+1
st introdotti da L1 e L2 sono in K2 (n + 1) o K1 (n + 1). L'uso di una veloce struttura dati hashset per K1 e K2 che è estesa in modo incrementale mantiene questo processo veloce anche per n più grandi. E se hai trovato un elemento comune per un certo n, puoi interrompere immediatamente il processo. Questo è quello che hai descritto nel tuo post.
Questo approccio funzionerà abbastanza velocemente anche se L1 e L2 hanno, per esempio, più di un milione di elementi, ma il primo elemento comune in entrambi gli elenchi è tra i "primi dieci" in entrambi gli elenchi. Non ti farà risparmiare molto quando L1 e L2 non hanno alcun elemento in comune, ma questo vale anche per qualsiasi altro approccio.