Verstappen had blasted past Hamilton early in his second stint and was edging clear when his Red Bull was pitched into a spin after being clobbered by Ocon at the second corner.
That dropped Verstappen behind Hamilton, who managed engine and tyre concerns to stay clear and win a race after clinching the title for the first time – he was winless in the grands prix he completed after wrapping up the title in 2015 and 2017 respectively.
Kimi Raikkonen took advantage of a mistake from Ferrari teammate Sebastian Vettel early on and Valtteri Bottas’s challenge fading to complete the podium.
Hamilton maintained his pole advantage at the start as Bottas jumped Vettel for second place.
Verstappen started fifth but made short work of the two Ferraris by passing them both on successive laps into the first corner, nailing Raikkonen around the outside under braking before diving inside Vettel.
He caught Bottas quickly and cleared the Mercedes on lap 10 when Bottas failed to close the door properly into Turn 1.
Hamilton pitted on lap 19, one lap after Bottas, as Mercedes switched to fresh tyres much earlier than its rivals.
Verstappen continued until lap 36 but emerged behind Hamilton despite initially looking like he might build a big enough lead and Hamilton growing frustrated by what he thought was a lack of information from his team.
By running so long in the first stint Verstappen was able to switch to softs and with much fresher and faster tyres, he cruised up to the back of Hamilton and blasted past on the start-finish straight on lap 40 of 71.
With Mercedes protecting Hamilton’s engine that should have set Verstappen up a relatively simple run to the flag, but four laps later Verstappen’s win bid unraveled at the first two corners.
Verstappen put a lap on Ocon but his ex-karting and Formula 3 rival fought back into Turn 1 to the outside of the Red Bull then held firm as track went back to the right.
Ocon did not back out and Verstappen turned in, with the resulting contact spinning both and leaving Verstappen with floor damage, although he was lucky to only lose a place to Hamilton.
Verstappen was able to gradually cut into Hamilton’s five-second advantage over the rest of the race, but Hamilton was just able to hang on despite voicing engine concerns and complaining of a lack of grip late on.
The result also gave Mercedes the constructors’ title.
Raikkonen made it through to third after passing Bottas into Turn 1 just as Verstappen was being taken out.
After passing Vettel in the opening stages when the German ran wide at Turn 4, Raikkonen was re-passed by his teammate in the pitstop phase.
However, Vettel let Raikkonen go to attack and successfully pass Bottas – while Vettel had to make a second stop after dropping to the tail of the top six, behind the Red Bull of Daniel Ricciardo.
The recovering Ricciardo made it up to fourth after passing Bottas as well, which triggered a second stop for the Finn, who was complaining with blistering.
Bottas and Vettel thus completed the top six, while Charles Leclerc took seventh for Sauber after dominating the best-of-the-rest fight.
The 2019 Ferrari driver finished comfortably clear of Romain Grosjean’s Haas after passing teammate Marcus Ericsson at the start.
Grosjean finished eighth ahead of fellow Haas driver Kevin Magnussen, while Sergio Perez took the final point in 10th.
Brendon Hartley was first finisher outside the top 10 after an ill-tempered conclusion in which he raged over the radio at Toro Rosso teammate Pierre Gasly refusing to comply with an order to swap positions.
Gasly, who was also angry, eventually let Hartley past on the final lap but also lost a place to Renault Carlos Sainz.
There were only two retirements from the grand prix. Ericsson stopped early on after picking up damage at the first corner, slipping down the order and suffering a spin after his pitstop.
Nico Hulkenberg was ordered to stop as Renault recorded a high engine temperature.