The five-time champion, who looked to be heading for second behind the 21-year-old Monegasque, gained the lead with 10 laps remaining when Formula One’s new star, who claimed a record-breaking pole position for Ferrari on Saturday, was hit by engine problems.
As he slowed, Hamilton hunted him down to claim his first win of the season, his third at the Bahrain International Circuit and the 74th of his career ahead of his Mercedes team-mate Valtteri Bottas, who won the season-opening Australian Grand Prix.
Leclerc came home third as the race finished behind a Safety Car, following the spectacular late exit of both Renaults at Turn Two, ahead of Max Verstappen of Red Bull.
“It happens,” said a calm Leclerc afterwards. “It’s part of motor sport. It’s a very hard one to take, but I am sure we will come back stronger.”
Four-time champion Sebastian Vettel finished fifth in the second Ferrari, after a late spin had damaged his front wing during a duel with Hamilton, ahead of British rookie Lando Norris who scored his first points for McLaren in sixth.
Kimi Raikkonen, 39, was seventh for Alfa Romeo ahead of Pierre Gasly of Red Bull, Thailand’s rookie Alex Albon of Toro Rosso, who also had his first points finish, and Mexican Sergio Perez of Racing Line.
“That was extremely unfortunate for Charles, he drove a great race,” said Hamilton, on the team radio.
“We’ve got work to do to keep these guys off our tails. It must be devastating for Charles.”
It was Leclerc’s first podium finish in F1 and he also scored a point for fastest lap.
Bottas stayed on top in the drivers championship, one point ahead of Hamilton.
“That was extremely unfortunate for Charles, he drove a great race,” Hamilton said over the radio.
“We’ve got work to do to keep these guys off our tails.”