The loss was the first of the season for the Chargers (4-1), leaving AFC West leader Oakland (4-0) as the NFL's lone unbeaten team. The Raiders beat Buffalo, 49-31 earlier Sunday.
The Broncos (4-1) bounced back from a mistake-filled, 34-23 Monday night loss at Baltimore and moved into a tie for second place with San Diego.
"It's always nice to find a way to win, especially after the way we played Monday night," Broncos Coach Mike Shanahan said. "We beat a really good football team and it's a credit to the players of how they worked during the week and how they eliminated distractions.
"But I would have been very surprised if our football team didn't come out and play one of their better games."
"We took the mask off today," said Broncos linebacker John Mobley. "We had a mask on Monday night in Baltimore and I don't know who those imposters were. I think we came out and got our swagger back today."
After throwing three interceptions on Monday night, Griese completed 18 of 22 passes in the first half when the Broncos built a 19-0 lead.
"This defense has been historically good against the run, so we knew coming in that we would have to throw the ball," said Griese, who finished 26 of 35 for 316 yards. "It was all by design. We like the matchups we were getting and the defenses we were getting, so we just tried to take advantage of those today. It felt good to throw the ball around today."
Griese hit Ed McCaffrey with a 69-yard touchdown on Denver's second play from scrimmage and threw an eight-yard scoring pass to rookie running back Clinton Portis with 4:25 left in the second quarter.
"He (Griese) was very accurate today," said McCaffrey, who had six catches for 113 yards. "He was on top of his game and did a great job. When you move the ball on offense, it's all up to your quarterback. Brian did an outstanding job for us."
O'Neal was ejected in the second quarter of Monday's game for bumping an official and fined $15,000. He responded to adversity and sealed the win with his 28-yard interception return with 2:54 left in the fourth quarter.
"I knew they were going to try to see where my head was at and, fortunately, I was on my game and able to make things happen," O'Neal said. "I was just trying to make plays today. I wanted to come out and forget about everything that happened last week.
"It's hard, but you just have to have a short-term memory as a cornerback. Sometimes you just have to forget it, let it go, and move on."
San Diego played without perennial Pro Bowl linebacker Junior Seau, who is nursing a sprained ankle. The chargers surrendered 417 total yards.
"There is no question that hurt them, no question at all," Broncos tight end Shannon Sharpe said. "It really hurt them with him not being there."
"I understand the importance of losing your leader, but in the National Football League, you have to have someone step up," Chargers Coach Marty Schottenheimer said. "In the reality of it, we had 11 guys out there, and these guys have to play better than we played."
Portis rushed for 102 yards on 20 carries while the Broncos held LaDainian Tomlinson, the NFL's rushing leader, to 48 yards on 14 carries. Tomlinson has rushed for 554 yards in five games.
"Our focus was to come out and stop Tomlinson from running and make (Drew) Brees beat us by throwing the ball," Broncos linebacker Al Wilson said. "I think we did a good job with that."
Schottenheimer had high praise for the Broncos' defense.
"They look a lot like the old Orange Crush defense," said Schottenheimer, who had his heart broken by the Broncos twice in the AFC Championship game when he coached Cleveland and once in the divisional playoff when he coached Kansas City. "This is a fast group, especially those linebackers."
Brees was 26 of 42 for 235 yards, but was intercepted twice and hit Curtis Conway with an eight-yard touchdown with just 1:31 left in the fourth quarter.
McCaffrey caught a deep slant over the middle for a 69-yard touchdown 2:03 into the game to give Denver a 7-0 lead.
"All receivers love to catch the long ball," McCaffrey said. "It felt really good to go out there and do that today. Hopefully, there will be more plays that pop up like that this season."
The score extended Griese's consecutive games streak with a touchdown to 20, the longest active streak in the NFL. At one point in the first half, he completed 13 straight passes, ending only with a spike to stop the clock.
On Denver's second touchdown drive, Griese was nine of nine for 81 yards and capped it with the scoring play to Portis.
Sam Brandon blocked a punt by Darren Bennett, who batted the ball out of the end zone for a safety with 2:22 left in the half. Bennett had punted the ball 451 straight times without a block.
"We only had 10 guys on the field. I take full responsibility for that," Schottenheimer said. "That was a big play in my mind. I felt we had a chance to battle back into it."
After the ensuing free kick, Griese drove the Broncos 60 yards in 12 plays and Jason Elam kicked a 36-yard field goal on the final play of the half, giving the Broncos a 19-0 lead.
Steve Christie kicked a 24-yard field goal 4:20 into the third quarter to put San Diego on the board.
"We just wanted to get some points on the scoreboard," Tomlinson said. "At that time, we were down 19-0, so we had to get something."