Entrambe le forme sono corrette, ma si usano in contesti leggermente diversi: "sono dovuto/a" si usa quando il verbo seguente (andare, venire, partire) prende "essere" ("sono andato/a") e si sottolinea l'azione; "ho dovuto" si usa quando il verbo seguente prende "avere" ("ho parlato") o quando si vuole dare maggiore enfasi all'obbligo, ma anche con i verbi che prendono "essere", "ho dovuto" è sempre accettato e diffuso, specialmente nel parlato, per semplificazione, anche se la regola tradizionale suggerisce di usare l'ausiliare del verbo retto.
La grammatica risponde chiaramente: i verbi servili dovere, potere e volere assumono, nei tempi composti lo stesso ausiliare richiesto dal verbo che accompagnano. Perciò bisogna dire: “Io sono dovuto andare”, perché si dice “io sono andato”; ma “Io ho dovuto parlare”, perché si dice “io ho parlato”.
Questi due ultimi verbi ammettono anche in lingua la possibilità di un uso transitivo e quindi, mentre uscire ed entrare prevedono tassativamente l'ausiliare essere, richiedono l'ausiliare avere: sono salito da te e sono sceso all'alba, ma anche ho salito la gradinata e ho sceso le scale.
l'ausiliare avere è già obbligatorio nel caso in cui con l'infinito si combini un pronome atono: «non ho potuto venirci»; se invece il pronome atono viene prima delle forme verbali, si ricade nella regola generale che impone essere: «non ci sono potuto venire».