Si emites/imprimes el valor cuando existe, no sería preciso un tercer array, salvo que se pida expresamente en el enunciado del 'problema'.
En cualquier caso, el sistema usado es subóptimo, aunque muy válido para pequeños arrays... Consume un tiempo n². Luego, cuando 'n' sea un número muy grande, te puedes imaginar lo lento que sería...
Algo muy óptimo sería ordenar ambos arrays (si se sabe de entrada que alguno está ordenado, puede omitirse para el mismo dicha operación), obviamente con un algoritmo rápido como quickSort (recurrir a uno lento como uno de burbuja no optimiza nada).
Una vez ordenados un simple bucle (lineal en 'n'), es suficiente para ir comparando...
La estrategia es entonces tomar uno de los arrays (sugiero tomar aquel cuyo último elemento sea menor), como referencia y tomar el ítem (del ciclo) actual, e ir indagando en el otro bucle mientras sea menor o igual al valor actual en el array de referencia...
// Se supone que ya se han ordenado los arrays al llegar a este punto, que quedan tal como se muestran:
Array1: 1,2,3,4,5
Array2: 0,0,1,2,4
// Bucle lineal.
Bucle para k desde 0 a array.lenght -1
v = Array1(k)
Hacer mientras (v<= Array2(n) )
si v=(array2(n)) imprimir "El ítem de valor " + v + " está presente en ambos arrays."
n +=1
Si (n >= array2.lenght) salirdelafuncion
Repetir
Fin bucle
OJO: No confundir que el bucle 'do' dentro del bucle 'for', es un bucle anidado, pués no lo es, son colineales... si se alcanza el final del array2, aún cuando se esté dentro del primer ítem del bucle 'for' la función acaba, cosa que no sucedería nunca con 2 bucles anidados.
Es decir el tiempo final será 'n' + 'm', que salvo para casos muy pequeños de 'n' y 'm' siempre será enromeneteme más óptimo que 'n'*'m' (n², si m=n).