Leetcode 23. Merge k Sorted Lists

Question:

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

Thinking

一個很自然的想法就是兩兩合并。現(xiàn)在假設(shè)有l1,l2,l3...ln那么現(xiàn)將l1,l2合并硼啤,合并后的新list(不妨叫做l12)再和l3合并粟矿,然后一直做下去励烦,但是考慮一下這樣的時間復(fù)雜度簸喂。假設(shè)對應(yīng)的長度分別是m1,m2,...mn馆蠕,這樣需要遍歷的次數(shù)是:
m1 + m2 (l1,l2合并)
m1 + m2 + m3 (l1+l2 和 l3 合并)
m1 + m2 + m3 + m4
.....
m1 + m2 + m3 ..... + mn *
綜合的時間復(fù)雜度是把上面的全都加起來
那就是:
n * m1 + n * m2 + (n-1) * m3 + (n-2)
m4 + .... mn
這個時間復(fù)雜度還是很巨大的刽锤。這樣做不合理的原因就是很多項被重復(fù)合并了很多次彪蓬。
改進(jìn)的想法是這樣的: m1 和 m2 合并, m3 和 m4合并 .... m(n-1) 和 mn合并,然后再兩兩合并悲立,最終只剩下一個為止鹿寨,這樣每一個鏈表都只被合并了一次,時間復(fù)雜度是0(N).當(dāng)然薪夕,具體實現(xiàn)的時候仍然可以考慮用遞歸來實現(xiàn)脚草。

Code

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def mergeTwoLists(self, list1, list2):
        p1 = list1
        p2 = list2
        head = ListNode('#')
        p = head
        while p1 is not None and p2 is not None:
            if p1.val <= p2.val:
                p.next = p1
                p1 = p1.next
            else:
                p.next = p2
                p2 = p2.next
            p = p.next
        while p1 is not None:
            p.next = p1
            p1 = p1.next
            p = p.next
        while p2 is not None:
            p.next = p2
            p2 = p2.next
            p = p.next
        # since the first element is what we defined '#'
        # and that is totally for mark
        return head.next



    def mergeKLists(self, lists):
        """
        :type lists: List[ListNode]
        :rtype: ListNode
        """
        size = len(lists)
        if size == 2:
            head = self.mergeTwoLists(lists[0], lists[1])
        elif size == 1:
            head = lists[0]
        elif size == 0:
            head = None
        else:
            mid = size / 2
            list1 = self.mergeKLists(lists[0:mid])
            list2 = self.mergeKLists(lists[mid:size])
            head = self.mergeTwoLists(list1, list2)
        return head

Performance

每次都不一樣
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市原献,隨后出現(xiàn)的幾起案子馏慨,更是在濱河造成了極大的恐慌,老刑警劉巖姑隅,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件写隶,死亡現(xiàn)場離奇詭異讲仰,居然都是意外死亡,警方通過查閱死者的電腦和手機冕房,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來毫捣,“玉大人培漏,你說我怎么就攤上這事牌柄。” “怎么了蹋宦?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵冷冗,是天一觀的道長惑艇。 經(jīng)常有香客問我,道長俺叭,這世上最難降的妖魔是什么熄守? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任裕照,我火速辦了婚禮晋南,結(jié)果婚禮上搬俊,老公的妹妹穿的比我還像新娘蜒茄。我一直安慰自己檀葛,他們只是感情好屿聋,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布润讥。 她就那樣靜靜地躺著楚殿,像睡著了一般脆粥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上规伐,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天鲜棠,我揣著相機與錄音萧朝,去河邊找鬼检柬。 笑死何址,一個胖子當(dāng)著我的面吹牛进胯,可吹牛的內(nèi)容都是我干的胁镐。 我是一名探鬼主播盯漂,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼就缆,長吁一口氣:“原來是場噩夢啊……” “哼竭宰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起狞甚,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎棺蛛,沒想到半個月后旁赊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體椅野,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡离福,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年蝶涩,在試婚紗的時候發(fā)現(xiàn)自己被綠了絮识。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片次舌。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡挪圾,死狀恐怖哲思,靈堂內(nèi)的尸體忽然破棺而出酱吝,到底是詐尸還是另有隱情务热,我是刑警寧澤崎岂,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布绩卤,位于F島的核電站濒憋,受9級特大地震影響凛驮,放射性物質(zhì)發(fā)生泄漏黔夭。R本人自食惡果不足惜本姥,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一氛赐、第九天 我趴在偏房一處隱蔽的房頂上張望鹰祸。 院中可真熱鬧,春花似錦尔破、人聲如沸懒构。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽颠悬。三九已至赔癌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間铝条,已是汗流浹背班缰。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工贤壁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人埠忘。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓脾拆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親莹妒。 傳聞我的和親對象是個殘疾皇子名船,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

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