李世民在围攻王世充时,窦建德领兵增援,李世民一举消灭窦军,俘窦建德本人,并随后围困洛阳,王世充被迫于高祖武德四年(621年)五月率残部投降。至此,王世充、窦建德两军被李世民击溃、消灭。
武德四年(621年)正月,唐行台仆射屈突通和赞皇公窦轨率兵与王世充军偶遇,并作战正处失利之时,李世民率黑衣骑兵赶到,抄袭并击溃王世充军,是役俘王军骑将葛彦璋,歼王军6000人,王世充本人战败逃走。二月,李世民选精锐骑兵千余人,均皂衣玄甲,分左右两队,以名将秦叔宝、程知节、尉迟敬德、翟长孙分任统领,在谷水(今河南渑池县渑水及其下游)大败王世充,并进而包围洛阳宫城,但洛阳城中守卫甚严,大炮飞石重达50斤,可以抛掷200步远,八弓弩箭粗如车幅,镞如巨斧般锋利,射程达500步远。因而李世民军队围洛阳10日而未果,但李世民毫不退缩,决心攻下洛阳,并严下军令,胆敢提班师者立斩不赦,加紧围攻王世充。在唐军的急攻下,王世充乃飞书窦建德求援,窦建德在徘徊犹豫后,接受刘彬的建议,令大将范愿驻守曹州,派遣孟海公、徐圆朗等将领,领兵10万,西行救援王世充。窦建德军一路战事顺利,连下管州(今河南郑州一带)、荥阳(今河南郑州附近),阳翟(今河南禹县)等州县,进入中原地区,并从黄河逆水而上,运送粮草,水陆并进。王世充闻知援军已来,并派其弟徐州行台王世辩、大将郭士衡等军数千与窦建德军会师,两军号称30万大军,并屯兵在成皋东,窦建德在板诸(今荥阳东北)修筑行宫。
鉴于军情变化,李世民采纳薛收的意见,采用围城打援的战术,准备先平定窦建德军后,再返头攻打王世充。李世民把部队分为两部分,一部由李元吉、屈突通等统领,继续围守洛阳。一部由自己带领3500人向东奔武牢。
王世充目视李世民率军历邙山,抵河阳,过巩县,但不明李世民底细,而不敢贸然出击。3月25日,李世民到达虎牢,距虎牢东20多里即是窦建德军营,26日,李世民派李世、程知节、秦叔宝分别统军埋伏路旁,自己亲率四名骑兵诱敌,窦军果然中计,派五六千人追击,遭伏,李世民军俘获窦军大将殷秋、石瓒,歼灭窦军300余人。李世民战后即修书陈说利害,劝窦军返回。
窦建德因王世充的不断告急,决定率大军进攻武牢。李世民五月初一北渡黄河,亲自察敌形势,并留一千马匹在河渚引诱窦建德,率部队连夜返回虎牢。第二天,窦建德率军抵达虎牢,李世民在窦建德军列阵时,趁势率军袭击又饥又疲的窦军,窦建德,阵脚大乱,唐军杀窦军三千余人,窦军一溃千里,被俘五万余人,窦建德本人亦被槊击中,被唐车骑将军白世俘虏,窦军只有窦夫人曹氏和左仆射齐善行率几百骑兵逃回洛州。后来齐善行奉窦建德夫人曹氏及其余将官降唐,窦建德故地全部被唐军平定。
李世民败俘窦建德后,押窦至洛阳城外与王世充相见,断绝王世充依靠外援的念头。并加紧围困洛阳,挖深堑、筑堡垒,致使洛阳城内粮食缺乏,城内饿死者成千上万。王世充面对这些残酷的事实,自知大势已去,便于五月初十日领太子、群臣两千多人到军门降唐。王世充的哥哥徐州行台王世辩以徐、宋等三十八州向河南道安抚大使李瑰投降,至此王世充故地都被平定。
窦建德被俘解至唐都长安被斩于市。王世充则因降唐,并有李世民不斩前言,而被免死,贬为庶人,与兄弟、子侄流放蜀,在定州府州驿站被仇人独孤机之子定州刺史独孤修德杀死。王世充子侄等亦因在流放路上谋反而均被杀。
