The final running before qualifying later on Saturday started in damp conditions, but ended in a frenetic fashion as the surface dried out. Leclerc pipped Vettel by just 0.027 seconds with his final lap.
Mercedes were well off the pace at the Autodromo Hermanos Rodriguez on Friday, but their speed might provide them with hope they can take the fight to Ferrari.
Bottas finished only 0.114 sec behind Leclerc, while Hamilton was just two-tenths off the Ferrari driver's pace.
Carlos Sainz finished an impressive fifth for McLaren, with Red Bull driver Max Verstappen sixth. British teenager Lando Norris ended the running in ninth.
Both Daniel Ricciardo and Nico Hulkenberg failed to set a time for Renault after both cars were struck with a hydraulics failure.