Charlotte went ahead for the last time in a back-and-forth final period when Raymond Felton hit a jumper from the top of the key, giving the Bobcats an 81-80 lead.
But Williams put the Hawks ahead to stay on a 3-pointer with 2:12 remaining. The Charlotte defense collapsed on Johnson, who swung the ball to Maurice Evans. He whipped it around to Williams all alone in the corner.
Rookie D.J. Augustin led the Bobcats with a career-best 26 points, only to miss a fallaway jumper from the baseline when Charlotte needed it most. Evans then came up with a big hoop for Atlanta, swishing an 18-foot jumper with 1:24 left.
The Hawks fell behind by 13 in the opening period and had to overcome 21 turnovers. Mike Bibby, who had only four points through the first three quarters, came alive in the fourth from beyond the 3-point stripe, hitting three of the long-range shots. He finished with 14 points.
Evans added 10.
Augustin, who was averaging a modest 10 points a game, doubled up on that before the third period was done. He connected on 7-of-11 from outside the arc.
But Gerald Wallace, with 17 points, was the only other Charlotte player in double figures. The Bobcats hit only 42 percent (33 of 78) from the field.
The Hawks got off to a miserable start. They went nearly five minutes without scoring, missing four straight shots and turning it over three times as Charlotte bolted to a 16-6 lead. Clearly frustrated, the Hawks kept barking about calls until Johnson was hit with a technical. Matt Carroll made the free throw, which gave the Bobcats their biggest lead, 21-8.
Atlanta clawed its way back in the second, reclaiming the lead for the first time since the opening minute when Bibby hit a jumper with 4:38 left in the half to make it 34-33. The Hawks were up 47-43 at the break and appeared to be pulling away late in the third period when Johnson hit back-to-back 3s, pushing Atlanta to a 62-56 lead.
But Charlotte closed the third on a 7-0 run, grabbing the lead on a frantic series in the closing seconds. Jared Dudley laid it in off a nifty pass from Augustin, then Carroll stole the inbounds pass from Al Horford, went up strong for the basket and was fouled by Horford with 3.2 seconds remaining. Carroll made the free throw to complete the three-point play, pushing the Bobcats ahead 63-62 going to the fourth.