日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當前位置:首頁 > php開源 > php教程 > [LeetCode] 023. Merge k Sorted Lists (Hard) (C++/Java/Python)

[LeetCode] 023. Merge k Sorted Lists (Hard) (C++/Java/Python)

來源:程序員人生   發(fā)布時間:2015-04-07 08:29:39 閱讀次數(shù):3069次

索引:[LeetCode] Leetcode 題解索引 (C++/Java/Python/Sql)
Github: https://github.com/illuz/leetcode


023. Merge k Sorted Lists (Hard)

鏈接

題目:https://oj.leetcode.com/problems/merge-k-sorted-lists/
代碼(github):https://github.com/illuz/leetcode

題意

和 021. Merge Two Sorted Lists (Easy) 類似,這次要 Merge K 個。

分析

很明顯可以想到利用已完成的 Merge Two Sorted Lists 的函數(shù)來用。
這時候有兩種方法:
1. (C++) 用2分的思想,把每一個 List 和它相鄰的 List 進行 Merge,這樣范圍就縮小了1半了,再重復這樣,就能夠 O(nklogk) 完成。比如: [1, 2, …, n] 的第1輪 Merge 是 [1, n/2], [2, n/2+1], …
2. (Python) 也是用2分的思想,就是把 Lists 分為兩部份,分別遞歸 Merge k Sorted Lists 后變成兩個 List ,然后再對這兩 List 進行 Merge Two Sorted Lists 。

這兩種方法都是遞歸調用,都可以進行記憶化,用空間換時間,不過我不清楚會不會超空間(Memory Limit Exceed),所以就沒試了~

除用2分的思路,還有更好寫的方法,就是用堆(heap),具體就是用優(yōu)先隊列(Priority Queue)。
(Java) 先把每一個 List 的第1個節(jié)點放進優(yōu)先隊列,每次取出隊列中的最大值節(jié)點,再把那個節(jié)點的 next 放進去。

代碼

C++:

class Solution { public: ListNode *mergeKLists(vector<ListNode *> &lists) { int sz = lists.size(); if (sz == 0) return NULL; while (sz > 1) { int k = (sz + 1) / 2; for (int i = 0; i < sz / 2; i++) lists[i] = mergeTwoLists(lists[i], lists[i + k]); sz = k; } return lists[0]; } ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) { if (l1 == NULL) return l2; if (l2 == NULL) return l1; ListNode *start, *p1; if (l1->val < l2->val) { p1 = start = l1; l1 = l1->next; } else { p1 = start = l2; l2 = l2->next; } while (l1 != NULL && l2 != NULL) { if (l1->val < l2->val) { p1->next = l1; p1 = l1; l1 = l1->next; } else { p1->next = l2; p1 = l2; l2 = l2->next; } } if (l1 != NULL) p1->next = l1; else p1->next = l2; return start; } };


Java:

public class Solution { public ListNode mergeKLists(List<ListNode> lists) { Queue<ListNode> heap = new PriorityQueue<ListNode>(new Comparator<ListNode>(){ @Override public int compare(ListNode l1, ListNode l2) { return l1.val - l2.val; } }); ListNode dummy = new ListNode(0), cur = dummy, tmp; for (ListNode list : lists) { if (list != null) { heap.offer(list); } } while (!heap.isEmpty()) { tmp = heap.poll(); cur.next = tmp; cur = cur.next; if (tmp.next != null) { heap.offer(tmp.next); } } return dummy.next; } }


Python:

class Solution: # @param a list of ListNode # @return a ListNode def mergeKLists(self, lists): if len(lists) == 0: return None if len(lists) == 1: return lists[0] mid = len(lists) // 2 left = self.mergeKLists(lists[:mid]) right = self.mergeKLists(lists[mid:]) # merge left and right dummy = ListNode(0) cur = dummy while left or right: if right == None or (left and left.val <= right.val): cur.next = left left = left.next else: cur.next = right right = right.next cur = cur.next return dummy.next


生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 人成在线 | 精品国产一区二区三区四区四 | 色又黄又爽18件免费网站 | 日韩综合色 | 中文字幕影院 | 国产在线精品拍揄自揄免费 | 国内久久精品视频 | 色肉色伦交av色肉色伦 | 国产精品178页 | jizzjizz中国丰满熟少妇 | 亚洲精品乱码97久久久 | 精品成人在线视频 | 成人二区| 久久精品日产第一区二区三区 | 日韩成人在线播放 | 成人免费视频网站在线看 | 免费一级淫片aaa片毛片a级 | 久久精品视频网 | 一区视频免费观看 | 国内成人精品2018免费看 | 国产精品欧美在线 | 日本精a在线观看 | 亚洲精品aaaa | 一区二区三区不卡视频在线观看 | 中文字幕久久久 | 国产精品视频99 | 国产操片 | 人操人人| 一区二区视频网站 | 少妇久久久久 | 精品一区精品二区 | 亚洲最大色综合成人av | 6080亚洲精品一区二区 | 亚洲一区二区三区欧美 | 亚洲福利网站 | 国产91精品一区二区 | av亚洲在线 | 欧美黑人xxxxx | 国产在线一区二区 | 干色网 | 秋霞午夜日韩免费毛片 |