23. 合併k個公升序鍊錶
合併k個公升序鍊錶
給你乙個鍊錶陣列,每個鍊錶都已經按公升序排列。
請你將所有鍊錶合併到乙個公升序鍊錶中,返回合併後的鍊錶。
示例 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 == lists.length
0 <= k <= 10^4
0 <= lists[i].length <= 500
-10^4 <= lists[i][j] <= 10^4
lists[i] 按 公升序 排列
lists[i].length 的總和不超過 10^4
public listnode mergetwolists
(listnode a, listnode b)
listnode head =
newlistnode(0
);listnode tail = head, aptr = a, bptr = b;
while
(aptr != null && bptr != null)
else
tail = tail.next;
} tail.next =
(aptr != null ? aptr : bptr)
;return head.next;
}
用乙個變數 ans 來維護以及合併的鍊錶,第 i 次迴圈把第 i 個鍊錶和 ans 合併,答案儲存到 ans 中。
}}
//k指標:k個指標分別指向k條鍊錶
public listnode mergeklists
(listnode[
] lists)
if(minnode == null || lists[i]
.val < minnode.val)}if
(minpointer ==-1
) tail.next = minnode;
tail = tail.next;
lists[minpointer]
= lists[minpointer]
.next;
}return dummyhead.next;
}
使用小根堆對 1 進行優化,每次 o(logk) 比較 k個指標求 min
相當於先把鍊錶節點都放進佇列中,優先佇列是按照順序進行入隊的,則取出的時候是順序大小的,把接地那構建成煉表。
class
solution
} listnode dummyhead =
newlistnode(0
);listnode tail = dummyhead;
while
(!pq.
isempty()
)}return dummyhead.next;
}}
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 定...
Leetcode23 合併K個排序鍊錶
題目 解題思路 這道題使用的是分治演算法。首先還用輔助函式mergetwolists 用來合併兩個有序單鏈表,不申請額外的空間實現原地合併。如下 listnode mergetwolists listnode l1,listnode l2 else head nexthead while l1 nu...
leetcode 23 合併K個排序鍊錶
合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。示例 輸入 1 4 5,1 3 4,2 6 輸出 1 1 2 3 4 4 5 6分析 我想是k次歸併。時間複雜度是 k 1 nlogn。題目分析 本題首先將每個鍊錶的首元素取出,構建乙個最小堆。堆頂則為最小的元素,用最小元素所在...