At the front, Sainz made it three Ferrari wins in the past five races after taking pole position, despite losing the lead to Verstappen on the first lap.
The race was immediately put under the safety car after a collision between Williams’ Alex Albon and Yuki Tsunoda’s RB led to the Japanese crashing at the first corner and Albon pulling off with damage after Turn Three.
When the race resumed, Sainz took just a lap before he passed Verstappen into Turn One, after which Norris closed in, leading to all the drama between the title contenders.
That allowed Leclerc through into second place and initially he tracked Sainz closely, and was within a second by lap 14.
But he dropped back a second the following lap, whereupon Sainz came on the radio to make an unspecified complaint about Leclerc, using bad language.
Leclerc stayed within two seconds of Sainz for a further three laps, before starting to drop back rapidly, slipping to nearly eight seconds behind before they made their single pit stops.
No further communications were broadcast and there were no replays of whatever might have happened, so it remains to be seen whether the drivers will discuss it after the race.
From that moment on, Sainz was untroubled out front, and Leclerc was equally comfortable in second for a long time.
But after the pit stops, Norris began to eat into Leclerc’s lead. The Ferrari was 4.7 seconds in front initially but Norris cut it back by 0.2secs or so a lap until he was on Leclerc’s tail with 10 laps to go.
Coming around the final corner on lap 62, Leclerc ran wide, onto the dusty outside of the track, and then off the circuit, and Norris swept by into second place.
Behind the top three, the Mercedes drivers were locked in combat throughout the race. Russell overtook Hamilton on lap 14 and stayed ahead until the pit stops, but the seven-time champion came back at Russell in the second stint and was on his tail with 20 laps to go.
They battled closely for many laps and eventually Hamilton found a way by into the first corner with five laps to go.
Behind them, Verstappen had no pace after his penalty and had a lonely race to sixth place.
Haas’ Kevin Magnussen took seventh, ahead of McLaren’s Oscar Piastri, eighth from 17th on the grid, Haas’ Nico Hulkenberg and Alpine’s Pierre Gasly.
Fernando Alonso, celebrating his 400th grand prix, retired early on with overheating brakes.
Verstappen’s team-mate Sergio Perez had a race to forget. He was penalised for a false start, after lining up well forward of his grid slot, and then damaged his car in an incident with RB’s Liam Lawson in Turn Four.
He finished last after Red Bull stopped him for fresh tyres late on for a failed attempt to take fastest lap.