23. Merge k Sorted Lists

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

31/05/2017
今天又看了一下這個(gè)題岗照,重溫了一下PriorityQueue。
這題思路:
每次把PriorityQueue里最小的那個(gè)Node擼下來凰浮,然后把這個(gè)最小Node的next結(jié)點(diǎn)加入到PriorityQueue里去。PriorityQueue的意義在于能保證隊(duì)首永遠(yuǎn)是最小的Node捐迫,后面的順序每次add/offer都會(huì)變酵紫,無法保證是按順序的(堆排序我還需要再復(fù)習(xí)一遍)亡鼠,但是我們也不需要后面是按順序的,只需要min heap的堆頂元素就行了稳强。


這題用了堆heap的思想场仲,用的是優(yōu)先權(quán)隊(duì)列實(shí)現(xiàn)的。

   public ListNode mergeKLists(ListNode[] lists) {
        if (lists == null || lists.length == 0) return null;
        PriorityQueue<ListNode> queue = new PriorityQueue<>(lists.length, new Comparator<ListNode>() {
            @Override
            public int compare(ListNode o1, ListNode o2) {
                //none - descending sort
                return o1.val - o2.val;
            }
        });

        for (ListNode list : lists) {
            if (list != null)
                queue.offer(list);
        }

        ListNode dummy = new ListNode(-1);
        ListNode tail = dummy;
        while (!queue.isEmpty()) {
            tail.next = queue.poll();
            tail = tail.next;

            //把每個(gè)鏈表上的node全擼下來加入到queue,注意這個(gè)擼下來的過程可能不是連續(xù)的键袱,可能先擼了第一個(gè)鏈表的next就去擼下一個(gè)鏈表了
            if (tail.next != null) {
                queue.offer(tail.next);
            }
        }
        return dummy.next;
    }

一開始我不懂為什么這題的參數(shù)是一個(gè)數(shù)組燎窘,我以為應(yīng)該是好幾個(gè)參數(shù),每個(gè)參數(shù)是一個(gè)list呢蹄咖。直到看到

            if (tail.next != null) {
                queue.offer(tail.next);
            }

我才恍然大悟褐健,每個(gè)listNode自身就是一個(gè)鏈表呀。

引用CodeGanker的講解:

維護(hù)一個(gè)大小為k的堆澜汤,每次取堆頂?shù)淖钚≡胤诺浇Y(jié)果中蚜迅,然后讀取該元素的下一個(gè)元素放入堆中,重新維護(hù)好俊抵。因?yàn)槊總€(gè)鏈表是有序的谁不,每次又是去當(dāng)前k個(gè)元素中最小的,所以當(dāng)所有鏈表都讀完時(shí)結(jié)束徽诲,這個(gè)時(shí)候所有元素按從小到大放在結(jié)果鏈表中刹帕。

其實(shí)我有點(diǎn)不太懂為什么這k個(gè)list要是已經(jīng)排序好的了吵血,因?yàn)檫@樣看來根本不需要啊(我不懂Java的PriorityQueue是不是每次add/offer一個(gè)元素就會(huì)自動(dòng)排序一次偷溺?如果是的話蹋辅,那無論怎么插入元素,poll出來的永遠(yuǎn)是排好序的queue中的最小元素呀挫掏。侦另。)

對于復(fù)雜度:這個(gè)算法每個(gè)元素要讀取一次,即是k*n次尉共,然后每次讀取元素要把新元素插入堆中要logk的復(fù)雜度褒傅,所以總時(shí)間復(fù)雜度是O(nklogk)“烙眩空間復(fù)雜度是堆的大小殿托,即為O(k)。

看來這里的offer/add用的是二分搜索形式杠河。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末碌尔,一起剝皮案震驚了整個(gè)濱河市浇辜,隨后出現(xiàn)的幾起案子券敌,更是在濱河造成了極大的恐慌,老刑警劉巖柳洋,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件待诅,死亡現(xiàn)場離奇詭異,居然都是意外死亡熊镣,警方通過查閱死者的電腦和手機(jī)卑雁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绪囱,“玉大人测蹲,你說我怎么就攤上這事」沓常” “怎么了扣甲?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長齿椅。 經(jīng)常有香客問我琉挖,道長,這世上最難降的妖魔是什么涣脚? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任示辈,我火速辦了婚禮,結(jié)果婚禮上遣蚀,老公的妹妹穿的比我還像新娘矾麻。我一直安慰自己纱耻,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布险耀。 她就那樣靜靜地躺著膝迎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪胰耗。 梳的紋絲不亂的頭發(fā)上限次,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天,我揣著相機(jī)與錄音柴灯,去河邊找鬼卖漫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛赠群,可吹牛的內(nèi)容都是我干的羊始。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼查描,長吁一口氣:“原來是場噩夢啊……” “哼突委!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起冬三,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤匀油,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后勾笆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體敌蚜,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年窝爪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了弛车。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蒲每,死狀恐怖纷跛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情邀杏,我是刑警寧澤贫奠,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站淮阐,受9級特大地震影響叮阅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜泣特,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一浩姥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧状您,春花似錦勒叠、人聲如沸兜挨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拌汇。三九已至,卻和暖如春弊决,著一層夾襖步出監(jiān)牢的瞬間噪舀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工飘诗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留与倡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓昆稿,卻偏偏與公主長得像纺座,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子溉潭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評論 2 354

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