Il costruttore che riceve già nome/cognome non è ovviamente fondamentale .... ti risparmiava solo i 2 set per ogni persona che costruisci. Non c'entra nulla con equals. Sarebbe stata solo una comodità in più ... null'altro.
In che senso non funziona? Il equals che hai scritto poco fa è tecnicamente corretto e appropriato. I due oggetti p2 e p3 hanno lo stesso "stato" (nome e cognome), quindi sono uguali e quindi p3.equals(p2) restituisce true.
Tutto qui.