唐朝武德三年七月(公元620年),李世民率军开始东征,平定王世充、窦建德两个军阀。王世充闻讯,调集各路兵马集结洛阳防御,并亲自带领3万人,前往慈涧。但在五万唐军的压力下,他意识到很难守住慈涧,于是又退回洛阳。李世民占领慈涧后,命唐军分路进攻洛阳外围城镇。9月,唐军先后攻克洛城、頧辕、虎牢,把王世充的大部分主力部队挤压在洛阳的包围圈内。
次年2月,唐军向洛阳城发起攻击,但王世充守备森严,唐军久攻不克,双方都疲惫不堪。李世民坚持继续攻城,誓言洛阳一日不破,军队一日不归。而王世充被围在洛阳孤城中,不得已向割据河北的窦建德求援。王、窦二人本来并不和睦,但如果王世充被唐军消灭,窦建德自身的安全也会受到危害;而如果王、窦二人联合打败李世民,则可以一举攻入关中,于是,窦建德调集10万大军,号称30万人,水陆并进,直奔洛阳。
面对情况的突然变化,李世民认为,王世充被围在洛阳城内,兵力和物资都很缺乏,很难长期抵抗下去。如果王、窦二军复活,王世充得到援助而复生,将对唐军构成很大的威胁。他决心,在强敌面前决不后退一步,而是争取战机,一举打败王世充和窦建德。他一面对洛阳围而不攻,力争使王世充因久围而不战自溃,一面亲率精兵前往虎牢,挡住窦建德,使其不能与王世充会合。
3月,李世民到达虎牢,与窦建德相持一个多月。这时,窦建德的幕僚凌敬建议,趁唐军主力集结河南之机,派军北上,进入唐军控制的山西,并威胁关中,逼使李世民回兵关中,使洛阳之围不战自解。但窦建德不听此议,一意向虎牢发动正面进攻。5月,他率主力在20余里的战线向虎牢发动攻击。由于轻敌,窦建德本人在激战中被唐军俘获,部下5万多人也当了俘虏。王世充见窦建德失败,援救无望,不得不出城投降。
此战的胜利,主要是由于李世民有坚定的信心和决心,在战场情况发生变化时,能当机立断,灵活反应,采用围城打援的战法。窦建德自恃人多,过于轻敌,不肯花费时间迂回到唐军侧后,企图直接打败李世民,解洛阳之围,反而为李世民创造了一举击破二军的机会。