Leetcode-Merge k Sorted Lists
Leetcode-Merge k Sorted Lists
昨天師兄的同事和他一起回實(shí)驗(yàn)室看我們,順便交流了一下面試的事情。他在猿題庫(kù)碰到了面試題:merge K sorted arrays。我馬上就聯(lián)想到了Leetcode上的相似的題目,當(dāng)時(shí)做的時(shí)候理解的不是很深,現(xiàn)在拿來(lái)再反思一下。
這道題目在分布式系統(tǒng)中非常常見(jiàn),來(lái)自不同client的sorted list要在central server上面merge起來(lái)1。
有兩種方法:1.分治法;2.堆。
分治法
最初,我是逐個(gè)list合并,像滾雪球一樣,有序的list越來(lái)越長(zhǎng),直到與最后一個(gè)list合并后,所有的list合并成功。提交后超時(shí)。設(shè)每個(gè)list長(zhǎng)度為n,由于merge的時(shí)間復(fù)雜度是O(n),所有總的時(shí)間復(fù)雜度是:n(k?1)+n(k?2)+……+n=nk2。而這與插入排序法的時(shí)間復(fù)雜度一致。
所以,我們借用歸并排序的思想:將問(wèn)題分解成兩個(gè)子任務(wù),即分成前后各一半的list,分別將它們排成有序的list之后,再將兩個(gè)有序的list合并。這樣時(shí)間復(fù)雜度滿足:T(k)=T(k/2)+O(n?k),T(k)=O(nklogk)。
struct ListNode *mergeTwoLists(struct ListNode *l1, struct ListNode *l2) {if (NULL == l1)return l2;if (NULL == l2)return l1;struct ListNode *head = NULL;if (l1->val < l2->val){head = l1;head->next = mergeTwoLists(l1->next, l2);}else{head = l2;head->next = mergeTwoLists(l1, l2->next);}return head;}struct ListNode *mergeLists_sub(struct ListNode *lists[], int begin, int end) {if (begin > end)return NULL;if (begin == end)return lists[begin];int mid = (begin + end)/2;struct ListNode *left = mergeLists_sub(lists, begin, mid);struct ListNode *right = mergeLists_sub(lists, mid+1, end);return mergeTwoLists(left, right); }struct ListNode *mergeKLists(struct ListNode *lists[], int k) {return mergeLists_sub(lists, 0, k-1); }堆(優(yōu)先隊(duì)列)
基本思路是這樣的:
1.取每個(gè)list的第一個(gè)元素構(gòu)成一個(gè)最小堆(或者說(shuō)優(yōu)先隊(duì)列),
2.重復(fù)以下步驟:
a.取出最小堆的第一個(gè)元素;(若用優(yōu)先隊(duì)列,直接push())
b.用a中取出的元素的所在list的下一個(gè)元素替換堆首元素,再重新使堆有序化。如果該list已經(jīng)是空的話,就用無(wú)窮大代替。(若用優(yōu)先隊(duì)列,先pop(),如果不為空,再push進(jìn)a中取出的元素的所在list的下一個(gè)元素)
復(fù)雜度同分治法。
如果鏈表變成數(shù)組,該如何處理呢?這里的做法是把每個(gè)元素都變成一個(gè)struct node節(jié)點(diǎn),存儲(chǔ)該元素所在二維數(shù)組的位置以及下一個(gè)元素,本質(zhì)上和sorted lists一樣。但是如果是二維vector呢,每一維的長(zhǎng)度可能不等,所以還得加上每個(gè)一維vector的長(zhǎng)度。代碼寫(xiě)得很精彩,正好可以復(fù)習(xí)一下今天寫(xiě)的堆排序的相關(guān)代碼!!!
總結(jié)
以上是生活随笔為你收集整理的Leetcode-Merge k Sorted Lists的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [STL]priority_queue
- 下一篇: Union-find