Ferrari driver Leclerc was quickest in the early running – which was interrupted by a red flag caused by Romain Grosjean crashing his Haas after losing it in Turn 5 and nosing into the barrier – with a time of 1m34.434s using medium Pirellis.
That put Leclerc 0.158s quicker than Hamilton, who used the hard compound to set his time.
But Hamilton hit back once the drivers started to switch on to the soft Pirellis, setting a time of 1m33.232s to secure top spot.
This was despite lagging 0.317s behind Leclerc at the end of the first sector, with a significant tow from Robert Kubica’s Williams in the middle sector allowing him to take half a second out of Leclerc.
Hamilton ended up with a time 0.301s quicker than Leclerc having eked out a little more time in the final sector.
Red Bull driver Max Verstappen was the last of the frontrunners to set a time on mediums, lapping 0.315s off the pace and 0.343s ahead of fourth-placed Sebastian Vettel.
This was still good enough to put Vettel, who had a spin late in the session while running hard Pirellis coming through the Turn 14 right-hander, well clear of the second Mercedes of Valtteri Bottas.
Bottas questioned where he had lost time over the radio, and he was informed was down to a combination of not having a Hamilton-lie tow and time lost on the straights – which he was also told was down to “something else probably”.
He subsequently made a small improvement to his time, but was still 0.813s off the pace.
Alex Albon completed the top six in the second Red Bull, 1.202s down and just three quarters of a tenth ahead of the man he replaced, Pierre Gasly.
Gasly declared “that’s a good lap” after he jumped up to seventh place with a time good enough to keep him well-clear of eighth fastest Carlos Sainz’s McLaren.
Racing Point driver Lance Stroll was one of the last to set a time on softs, jumping into the top 10 with a lap of 1m34.744s with 37 minutes remaining and ending up ninth.
Antonio Giovinazzi rounded out the top 10 for Alfa Romeo having been shuffled from seventh after his quick lap down to 10th place, 1.607s off the pace.
Giovinazzi survived a spin earlier in the session when the rear stepped out coming through the Turn 6 right-hander, with his initial correction firing the car in the opposite direction to the original moment.
Renault driver Daniel Ricciardo was 11th fastest despite a wide moment exiting Turn 9 on his lap, half-a-tenth quicker than the second Toro Rosso of Daniil Kvyat.
Nico Hulkenberg put the second Renault 13th ahead of McLaren’s Lando Norris with Sergio Perez 15th.
Kimi Raikkonen was 16th fastest with a lap 2.155s off the pace, just ahead of the first driver to set a time on softs – Haas’s Kevin Magnussen.
Grosjean’s pace on the mediums before going off and bringing his afternoon to a premature end on his fourth lap was good enough to secure 18th place, with the two Williams drivers 19th and 20th.
Russell was the quicker of the pair, lapping just over half-a-second faster than Kubica.