合并兩個有序鏈表的方法

什么是合并兩個有序鏈表

假設(shè)有兩條鏈表棍潘,這兩條鏈表分別都是升序排列的恃鞋,如下圖所示:



現(xiàn)在要求將二者合并成一條鏈表,并且該鏈表也是升序排列的亦歉,合并后的鏈表如下圖所示:


思路

如果對歸并排序有所了解山宾,那么這個問題就很簡單。在歸并排序的遞歸過程中鳍徽,我們的算法是將原始數(shù)組a切割成兩段:a1a2资锰,對a1a2分別排序后,再將二者歸并成一個有序的數(shù)組阶祭。這里的思路是一樣的绷杜,只不過將數(shù)組變成了鏈表。

大體的思路是:

  1. 確定合并后的新鏈表的頭節(jié)點head
  2. 使用一個指針l3濒募,初始化為head鞭盟,用這個指針來組織新鏈表的各個節(jié)點
  3. 使用兩個指針l1l2,分別初始化為兩條原始鏈表的頭節(jié)點瑰剃,用來遍歷這兩條鏈表齿诉。
  4. l1的值小于等于l2的值時,那么令l3->next=l1晌姚,否則令l3->next=l2
  5. 一般情況下粤剧,有一個鏈表會提前遍歷結(jié)束,例如鏈表1首先遍歷結(jié)束挥唠,也就是l1=Null時抵恋,那么由于另一條鏈表本身就是有序的,此時直接令l3->next=l2宝磨,就可以完成合并操作了弧关。

哨兵方法簡化代碼

如果直接按上述思路編碼盅安,那么確定新鏈表的頭節(jié)點head需要編寫額外的代碼。但仔細想想世囊,確定新鏈表head的過程無非是比較l1 headl2 head的值别瞭,將其中較小值的那個節(jié)點作為新鏈表的head,這個操作和后續(xù)遍歷兩條鏈表的比較操作的邏輯是一致的株憾。為了避免這種冗余代碼(以及處理各種邊界問題)蝙寨,可以考慮一種哨兵方法。也就是号胚,虛擬一個節(jié)點prehead籽慢,認為它的下一個節(jié)點就是新鏈表的頭節(jié)點head,并讓l3=prehead猫胁,從這個虛擬節(jié)點開始組織新的鏈表箱亿,這樣就無需對確定頭節(jié)點的操作做特殊處理了。在最后整理好新的鏈表時弃秆,我們直接返回prehead->next届惋,得到的自然就是l3的頭節(jié)點了。

代碼實現(xiàn)

下面給出Python代碼的一個實現(xiàn):

class Solution:
    def mergeTwoLists(self, l1, l2):
        # 新建一個虛擬節(jié)點作為哨兵節(jié)點
        # 作為目標鏈表l3頭節(jié)點的前面一個節(jié)點
        prehead = ListNode(-1)
        # 利用prev節(jié)點來組織新的鏈表
        prev = prehead
        
        # 循環(huán)截至條件是l1和l2其中任意一個鏈表已經(jīng)遍歷完
        while l1 and l2:
            # 比較l1和l2指向的節(jié)點的值
            # 將值比較小的那個加入到新鏈表中
            # 然后將該鏈表過渡到下一個節(jié)點
            if l1.val <= l2.val:
                prev.next = l1
                l1 = l1.next
            else:
                prev.next = l2
                l2 = l2.next            
            prev = prev.next

        # 將還沒有遍歷完的那個鏈表直接添加到新鏈表的末尾
        prev.next = l1 if l1 is not None else l2
     
        # 返回的是哨兵節(jié)點的下一個節(jié)點菠赚,也就是新鏈表的頭節(jié)點
        return prehead.next
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末脑豹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子衡查,更是在濱河造成了極大的恐慌瘩欺,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拌牲,死亡現(xiàn)場離奇詭異俱饿,居然都是意外死亡,警方通過查閱死者的電腦和手機塌忽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門拍埠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人土居,你說我怎么就攤上這事枣购。” “怎么了擦耀?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵棉圈,是天一觀的道長。 經(jīng)常有香客問我埂奈,道長迄损,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任账磺,我火速辦了婚禮芹敌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘垮抗。我一直安慰自己氏捞,他們只是感情好,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布冒版。 她就那樣靜靜地躺著液茎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪辞嗡。 梳的紋絲不亂的頭發(fā)上捆等,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機與錄音续室,去河邊找鬼栋烤。 笑死,一個胖子當著我的面吹牛挺狰,可吹牛的內(nèi)容都是我干的明郭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼丰泊,長吁一口氣:“原來是場噩夢啊……” “哼薯定!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瞳购,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤话侄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后学赛,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體年堆,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年罢屈,在試婚紗的時候發(fā)現(xiàn)自己被綠了嘀韧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡缠捌,死狀恐怖锄贷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情曼月,我是刑警寧澤谊却,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站哑芹,受9級特大地震影響炎辨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜聪姿,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一碴萧、第九天 我趴在偏房一處隱蔽的房頂上張望乙嘀。 院中可真熱鬧,春花似錦破喻、人聲如沸虎谢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽婴噩。三九已至,卻和暖如春羽德,著一層夾襖步出監(jiān)牢的瞬間几莽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工宅静, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留章蚣,地道東北人。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓坏为,卻偏偏與公主長得像究驴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子匀伏,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容