隨著中共占領全東北和徐淮戰局的日趨惡化,整個內戰的形勢對國民政府已經非常不利了。1948年11月時,中共西北野戰軍已將國府西安綏靖公署主任胡宗南的部隊壓制在了關中地區,華北軍區徐向前部也在10月挫敗國軍的進攻后將國府太原綏靖公署主任閻錫山的部隊困于太原一帶(此即太原戰役),不過由于當時解放軍即將進攻平津,不想傅作義南逃西撤,因此中央軍委于11月16日下達了緩攻太原、圍而不打的命令。此外,解放軍華北軍區第2、第3兵團當時分別在河北和綏遠東部休整,隨時準備圍攻國府華北剿匪總司令部的后方基地綏遠省會歸綏,而剛剛拿下東北的東北野戰軍第2兵團也已進至河北薊縣一帶,其主力則在沈陽、營口、錦州地區休整,準備一個月后開進山海關,進攻傅作義。
在此形勢下,華北剿總司令傅作義所部60萬國軍已被孤懸于北平、天津、張家口和唐山地區,面臨著被中共東北野戰軍和華北軍區部隊合擊的危險。當時,蔣介石認為:東北既已丟失,華北必然不保,徐淮戰事又前途未卜,故為今之計唯有放棄平津,將傅作義部盡數南撤,加強長江防線。不過,美國人不同意蔣介石的想法,他們主張傅作義固守華北,因華北之得失具有十分重要的政治意義。另一方面,華北剿總司令傅作義本是綏遠一帶的地方軍閥,或稱地方實力派,因此他深恐南撤后部隊被中央軍吞并,寧可在萬不得已時西逃綏遠。1948年11月初,蔣介石電召傅作義至南京商討華北作戰方針,二人均認為東北野戰軍在遼沈一戰后至少要休整3個月到半年才能入關作戰,因此解放軍華北軍區部隊在兵力上不占優勢,國軍留駐華北以為牽制對整個戰局亦屬有利。11月下旬,傅作義調整兵力部署,放棄承德、保定、山海關、秦皇島等地,將主要兵力部署在北平至張家口一線,力圖固守北平、天津和張家口;同時,蔣介石也調嫡系部隊至北平以東至唐山一線,確保塘沽海口,以備戰局不利時從海路撤退。
另一方面,中共高層雖然明知一旦國軍撤逃華北,平津便可不戰而得,但卻仍不肯放棄“殲滅更多國軍、以利今后渡江作戰”的機會。1948年11月中旬,中共中央軍委下令華北軍區部隊停止進攻太原、撤圍歸綏,以穩住傅作義,不使其因孤立而逃跑,同時指示報紙、廣播等媒體大肆宣傳東野在東北的慶功、練兵和高層會議等活動,以使蔣介石確信東北野戰軍短期內不會入關。接著,華北軍區第3兵團奉命包圍張家口,切斷了傅作義部西逃綏遠的道路,吸引其派兵西援,第2兵團和東北野戰軍先遣兵團也隨即出擊北平至張家口一線,隔斷了北平與張家口的聯系,緊緊拖住了傅作義和蔣介石的部隊,為東野入關作戰爭取時間。另外,毛澤東還下令東北野戰軍80萬大軍立即結束休整,星夜進軍,隱蔽入關,與華北軍區主力共同提前發起平津戰役。
奉命指揮平津戰役的中共將領為東北野戰軍司令員林彪、政治委員羅榮桓和參謀長劉亞樓,三人入關前,戰役暫由中央軍委直接指揮。1949年1月10日,中共中央決定由林彪、羅榮桓和華北軍區司令員聶榮臻3人組成平津作戰總前委,林彪為書記。1948年11月23日,東北野戰軍主力由錦州、營口、沈陽等地出發,隱蔽向北平、天津、唐山、塘沽地區開進。11月25日,華北軍區第3兵團由集寧地區東進。
11月29日,平津戰役開始,按照對平、津、張守軍“圍而不打”、“隔而不圍”的既定方針,華北軍區第3兵團首先向張家口外圍國軍發起攻擊,至12月2日,先后占領柴溝堡、萬全、沙嶺子等地,對張家口形成包圍態勢。此間,傅作義認為華北軍區解放軍進攻張家口只是一次局部行動,因此決定乘東北野戰軍尚未入關之際,集中主力首先擊破華北軍區部隊,然后以逸待勞,迎擊東野。為此,傅作義下令其主力35軍和104軍258師分由豐臺、懷來乘汽車連夜向張家口馳援,駐昌平的104軍移至懷來,駐涿縣的16軍移至南口、昌平,以確保北平與張家口的交通聯系。12月2日,華北軍區第2兵團乘傅作義主力西援之機,以三個縱隊由易縣、紫荊關向涿鹿、下花園急進,切斷懷來、宣化間的聯系,東北野戰軍第2兵團也派出第41、48軍等部由薊縣向懷來、南口急進,切斷北平、懷來間的聯系。12月5日,東北野戰軍在行進途中攻克密云,殲滅國軍第13軍1個師,爾后主力繼續南進;華北軍區第2兵團進至涿鹿以南待機。
得知密云失守后,傅作義感到北平受到威脅,急令第35軍由張家口星夜東返,第104軍主力及第16軍由懷來、南口向西接應,第94軍及第92、62軍由楊村、崔黃口、蘆臺地區開往北平,加強防御。12月6日,國軍第35軍乘汽車東撤,華北軍區第2兵團在冀熱察軍區部隊的配合下進行了節節阻擊,將其滯留于新保安地區。接著,第2兵團主力趕到新保安以東,并于12月8、9兩日打退了第35軍及第104軍主力的東西夾擊,將第35軍包圍于新保安。12月9日晚,東北野戰軍前出到懷來、康莊、南口間,進至康莊的國軍第16軍指揮所及2個師懼怕被殲,掉頭向北平撤逃,10日被東北野戰軍所屬第41軍殲滅于康莊東南地區。此間,國軍第104軍主力腹背受敵,又得知第16軍已經東逃,因此放棄了接應第35軍的計劃,由新保安以東地區經懷來向北平撤逃,東北野戰軍各部隊立即展開追擊和堵擊,于12月11日在懷來縣城以南的橫嶺、白羊城一帶將其全部殲滅。
與此同時,華北軍區第3兵團攻占宣化,并于12月7日在沙嶺子追殲由宣化向張家口撤逃的傅系第101軍271師,8日完成對張家口的包圍。隨后,由華北軍區第3兵團指揮的北岳軍區部隊、西北野戰軍第8縱隊騎兵旅和內蒙古軍區騎兵第11師等部攻克張北,孤立了張家口。此間,東北野戰軍主力由喜峰口、冷口越過長城,到達河北省薊縣、玉田、豐潤地區。
至此,解放軍已切斷傅作義西逃的道路,但其尚有南逃可能。12月11日,毛澤東指示前線領導人,萬不可讓傅作義從海上逃跑。接著,解放軍為避免傅作義放棄平津南逃,決定在兩個星期內對平津國軍圍而不打或隔而不圍,淮海戰場部隊也在雙堆集戰役殲滅黃維兵團后暫停了對杜聿明部的進攻,同時山東軍區還派出部隊控制濟南附近一段黃河,并在膠濟鐵路線上預作準備,防止傅作義部沿津浦鐵路經濟南向青島撤退。隨后,中共中央軍委指示華北軍區抽調部隊,控制保定、石家莊、滄州一線,準備搜捕由平津潰散南逃之國軍。不久,解放軍逼近平津,傅作義急忙放棄南口、涿縣、盧溝橋、通縣及唐山、蘆臺、廊坊等地,向北平、天津、塘沽收縮兵力。至12月15日,東北野戰軍一部已占領南口、豐臺、盧溝橋,從北面和西南面包圍了北平;東野第1兵團和華北軍區第7縱隊則占領了通縣、采育鎮、廊坊及黃村,從東北面和東南面包圍了北平,17日又占南苑機場。至12月20日,東北野戰軍又占領了唐山、軍糧城、咸水沽、楊柳青、楊村等地,切斷了天津、塘沽間的聯系,并由寶坻、漢沽、山海關向平津疾進。
12月21日,華北軍區第2兵團3個縱隊共9個旅發起新保安戰役,向被困于新保安的國軍發起攻擊,當日掃清外圍據點,22日晨開始攻城,經10小時激戰,全殲傅作義嫡系精銳第35軍軍部和2個師以及保安部隊共1.6萬人,軍長郭景云自殺。
為防止張家口國軍向西突圍,東北野戰軍第41軍奉命于攻擊新保安之前,由南口西進,加強對張家口的包圍。12月23日拂曉,張家口國軍全力向北突圍,華北軍區第3兵團及東北野戰軍第41軍共11個旅(師),在北岳、內蒙古軍區部隊配合下,展開堵擊和追擊,當晚攻陷張家口,至24日晨,將國軍壓縮在張家口以北不足1公里寬、10公里長的山溝內。12月24日傍晚,解放軍經激戰,在張家口東北西甸子、朝天洼一帶殲滅國軍第11兵團部、第105軍等部共7個師(旅),贏得張家口戰役。
在津、塘方向,解放軍原計劃先攻塘沽,后打天津,但因塘沽東面靠海,其他三面為水渠鹽池,不宜進行包圍,也不便大部隊展開,加之北平、天津國軍有突圍可能,所以改為以少數兵力監視塘沽,集中主力先打天津。12月29日,中共中央軍委批準了東北野戰軍的圍攻天津計劃。1949年1月2日,東野各攻擊部隊進至天津周圍,至13日基本肅清了外圍據點。此間,指揮天津戰役的東北野戰軍參謀長劉亞樓勸降國軍守將陳長捷未果,解放軍遂于1月14日上午對天津發起總攻,從東西南三面突破城防。1月15日晨,解放軍東西主攻集團于金湯橋會師,將守軍分割成數塊,爾后采取擊弱留強戰法,至15時攻占天津,全殲守軍13萬余人,俘獲警備司令官陳長捷,結束天津戰役。天津失陷后,據守塘沽的國軍第17兵團部及第87軍等部5個師共5萬余人于1月17日乘船南逃,東北野戰軍第49軍追殲其后尾3000人,進占塘沽。
新保安、張家口、天津相繼失守后,駐北平的國軍華北剿匪總司令部25萬余人完全陷于絕境。中共方面鑒于北平乃歷史文化古城,不愿因攻城作戰損毀文物古跡,因此決定通過談判和平接管,同時也指示部隊進行戰備,以在談判不成時武力奪取之。駐守北平的華北剿總司令傅作義早在1948年12月15日就曾派代表與解放軍前線司令部進行談判,但因傅作義當時實力尚存且戰事尚有可為,所以沒有接受中共的勸降。新保安、張家口戰役后,傅作義又于1949年1月7日派代表偕同民主同盟北平負責人、燕京大學教授張東蓀到解放軍平津前線司令部進行了第二次談判,林彪、聶榮臻在談判中提出:北平、天津、塘沽、歸綏各點守軍應開出城外,按解放軍軍制進行改編,并限天津守軍于13日前先行開出城外聽候改編。此時的傅作義仍在觀望,因此雙方協議仍未達成。1月13日,傅作義再派與中共素有交往的華北剿總副總司令鄧寶珊到平津前線司令部進行第三次談判。在1月14日的談判中,林彪、羅榮桓、聶榮臻指出:人民解放軍已開始攻擊天津,故此次談判不再包括天津;其他各點守軍出城后,應一律解放軍化,其駐地一律解放區化。
1月10日,解放軍結束淮海戰役,北方局勢已成定局。1月14日,毛澤東發表《關于時局的聲明》,提出與南京國民黨政府及國民黨地方政府和軍事集團進行和平談判的“八項條件”。1月16日,林彪、羅榮桓致函傅作義,敦促其當機立斷,接受“八項條件”,中共北平地下黨也趁機通過民主人士和北平國軍內部親共將領開展工作,蔣介石則派其次子蔣緯國攜其親筆信到北平,要傅作義堅守北平或南撤。最終,傅作義選擇了投誠中共,并于1月21日與中共平津前線司令部達成《關于和平解決北平問題的協議》。1月22日至31日,駐北平國軍陸續撤出城外,進至解放軍指定的地點聽候改編。1月31日,解放軍開入北平城內進行接管,平津戰役至此結束。
平津戰役前后64天,國軍被殲或被改編52萬,共軍傷亡不到4萬,國府由此喪失華北大部(除歸綏、太原、新鄉等少數地區),中共的華北、東北兩大解放區連成一 片。至此,中共解放軍與國軍戰略大對決的三次標志性戰役均告結束,共軍取得全面勝利,奠定了進軍全國、奪取政權的基礎,國軍則損兵160萬,精銳盡失,丟掉了長江中下游以北的廣大地區,內戰之勝敗已無懸念。
平津戰役結束后,解放軍調集32萬大軍會攻太原。1949年4月20日,解放軍各路攻城部隊相繼突破國軍防線,進攻太原城外圍據點,至22日全部占領之。4月24日晨,解放軍在1300門火炮的支援下攻入城內,與國軍展開巷戰,全殲國軍,占領太原,取得太原戰役的勝利。此間,國府山西省代主席梁敦厚率部拼死抵抗,城破時,守軍500余人集體自殺,后來被臺灣方面譽為“太原五百完人”。