分治 leetcode 23 合併K個公升序鍊錶

2021-10-10 03:12:06 字數 2117 閱讀 2890

題目鏈結

給你乙個鍊錶陣列,每個鍊錶都已經按公升序排列。

請你將所有鍊錶合併到乙個公升序鍊錶中,返回合併後的鍊錶。

示例1:

輸入:lists =[[

1,4,

5],[

1,3,

4],[

2,6]

]輸出:[1,

1,2,

3,4,

4,5,

6]解釋:鍊錶陣列如下:[1

->4-

>5,

1->3-

>4,

2->6]

將它們合併到乙個有序鍊錶中得到。1-

>1-

>2-

>3-

>4-

>4-

>5-

>

6

示例2:

輸入:lists =

輸出:[

]

示例3:

輸入:lists =[[

]]輸出:[

]

在思考如何解決合併k個公升序鍊錶之前,考慮如何合併兩個公升序鍊錶。

合併兩個鍊錶的過程有點類似於歸併排序中的過程,利用兩個指標分別遍歷兩個鍊錶,比較當前兩個節點中數的大小,將較小的數加入新鍊錶即可。

listnode*

mergetwolists

(listnode* l1, listnode* l2)

else

cur = cur-

>next;

} cur-

>next = l1 ==

nullptr

? l2 : l1;

return head-

>next;

}

既然我們現在已經知道了如何合併兩個鍊錶,那麼我們可以令結果鍊錶為a,每次從鍊錶陣列中獲取乙個鍊錶b,不斷將a、b合併即可:

listnode*

mergeklists

(vector>

& lists)

return ans;

}

用分治法優化後的**:

listnode*

merge

(vector >

&lists,

int l,

int r)

if(l > r)

int mid =

(l + r)/2

;return

mergetwolists

(merge

(lists, l, mid)

,merge

(lists, mid +

1, r));

}listnode*

mergeklists

(vector>

& lists)

class

solution

else

cur = cur-

>next;

} cur-

>next = l1 ==

nullptr

? l2 : l1;

return head-

>next;

} listnode*

merge

(vector >

&lists,

int l,

int r)

if(l > r)

int mid =

(l + r)/2

;return

mergetwolists

(merge

(lists, l, mid)

,merge

(lists, mid +

1, r));

} listnode*

mergeklists

(vector>

& lists)

};

分治實現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 解析 看到這一題,馬上就能想到之前的合併兩個鍊錶leetcode 21.合併兩個有序鍊錶 這一題相當於上一題的公升級版,從合併的實現方法上來說可以...