日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Leetcode-Merge k Sorted Lists

發(fā)布時(shí)間:2024/4/11 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Leetcode-Merge k Sorted Lists 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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ù)雜度同分治法。

class nodeComparison {//此函數(shù)要加上public。//“>”說(shuō)明是最小堆。“<”說(shuō)明是最大堆 public: bool operator() (Node* n1, Node* n2){return n1->val > n2->val;} };Node* mergeKsortedLists(vector<Node*> &lists) {if (lists.empty())return NULL;priority_queue<Node*, vector<Node*>, nodeComparison> pq;int sz = lists.size();for (int i = 0; i < sz; i++){if (lists[i] != NULL)pq.push(lists[i]);}Node helper(0);Node *helper_ptr = &helper;while (!pq.empty()){Node *toAdd = pq.top();pq.pop();helper_ptr->next = toAdd;helper_ptr = toAdd;if (toAdd->next)pq.push(toAdd->next);}return helper.next; }

如果鏈表變成數(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)代碼!!!


  • Merge k Sorted Lists http://www.tuicool.com/articles/ZnuEVfJ. ?
  • 總結(jié)

    以上是生活随笔為你收集整理的Leetcode-Merge k Sorted Lists的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。