Hamilton had slipped to third place after a Safety Car restart caused by Alfa Romeo’s Kimi Raikkonen collided with Antonio Giovinazzi’s left rear wheel on lap seven.
But Hamilton, 36, passed Verstappen on lap 11, eventually passing Bottas, who had started on pole, to take the lead nine laps later.
Once he took the lead on the Algarve International Circuit, Hamilton never looked back, winning by a comfortable lead of 29.148 seconds.
Hamilton’s victory is his second of the season and puts him eight points ahead of Red Bull’s Verstappen in the title standings.
“It was such a tough race physically and mentally,” Hamilton told reporters after the race. “It hasn’t been a perfect day, so we’ll be looking at those areas and turning the stones over.”
The seven-time world champion will look to extend his lead in the title standings at the Spanish Grand Prix on May 9.