Leetcode23 合併K個排序鍊錶

2021-09-11 18:09:12 字數 1142 閱讀 2772

題目:

解題思路:

這道題使用的是分治演算法。首先還用輔助函式mergetwolists(…)用來合併兩個有序單鏈表,不申請額外的空間實現原地合併。

**如下:

listnode*mergetwolists(listnode*l1,listnode*l2)

else

head=nexthead;

while(l1!=null&&l2!=null)

else

nexthead=nexthead->next;

}if(l1)nexthead->next=l1;

else nexthead->next=l2;

return head;

}

然後在mergeklists(…)函式中使用分治法,先將含有k個有序單鏈表的vector陣列一分為二,於是得到了兩個子陣列,我們稱之為左陣列和右陣列。然後再對兩個子陣列再分別使用相同的分治法,再次一分為二。直到陣列長度為1或2,當陣列長度為1時,直接返回即可,如果陣列長度為2,就返回兩陣列的合併,這時就用到了mergetwolists函式,最後在將所有的子結果合併,就得到k個排序鍊錶的合併。

這道題使用分治的思想很簡單,即將大問題分割成規模相同的小問題,逐個解決小問題後,將得到的結果再次合併,就得到大問題的結果。分治和遞迴是相輔相成的。

**如下:

/**

* definition for singly-linked list.

* struct listnode

* };

*/class solution

for(int i=middle+1;ival<=l2->val)

else

head=nexthead;

while(l1!=null&&l2!=null)

else

nexthead=nexthead->next;

}if(l1)nexthead->next=l1;

else nexthead->next=l2;

return head;}};

分治實現LeetCode 23題 合併K個排序鍊錶

紀念第一道沒有看題解做出來的困難題 分治思想 歸併排序實現合併k個排序鍊錶 由於是實現一連串已經排序的鍊錶,所以第一時間想到了歸併排序 又由於是實現多個鍊錶的總排序,為了減少時間複雜度又想到了分治思想,這一題中也就是二分法 做了這麼多天的題總算有點進步 class solution 結果陣列的頭結點...

LeetCode 23 合併 K個排序序列

合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。示例 輸入 1 4 5,1 3 4,2 6 輸出 1 1 2 3 4 4 5 6 解題思路 採用分治的思想,將 k 個鍊錶的合併問題轉換成,合併 2 個有序鍊錶的問題 typedef struct listnode list 定...

leetcode 23 合併K個排序鍊錶

合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。示例 輸入 1 4 5,1 3 4,2 6 輸出 1 1 2 3 4 4 5 6分析 我想是k次歸併。時間複雜度是 k 1 nlogn。題目分析 本題首先將每個鍊錶的首元素取出,構建乙個最小堆。堆頂則為最小的元素,用最小元素所在...