Zverev, with his back against the wall, raised his game just in time to deny the Spanish 20th seed the upset and, in doing so, secured his first career victory from two sets down on his second match point.
The German looked headed for certain defeat after committing 36 errors through the first two sets but used his versatile game to pick himself up and looked like a completely different player the rest of the way.
Zverev, who is bidding to become the first German Grand Slam champion since Boris Becker won the 1996 Australian Open, will face second seed Dominic Thiem in Sunday’s final.