Heaps (priority queues)

k sorted lists go in, one sorted list comes out — a min-heap of the k front items always knows whose turn is next

space play · ←/→ step · home restart
1function mergeKStreams(streams, key) {
2 // Only the k heads live in the heap, never the whole feed.
3 const heads = new Heap((a, b) => a.key - b.key);
4 for (let i = 0; i < streams.length; i++) {
5 const first = streams[i][0];
6 if (first !== undefined) {
7 heads.push({ key: key(first), stream: i, pos: 0 });
8 }
9 }
10
11 const merged = [];
12 for (;;) {
13 const head = heads.pop(); // smallest of the k heads
14 if (head === undefined) break; // every stream exhausted
15
16 merged.push(streams[head.stream][head.pos]);
17
18 const next = streams[head.stream][head.pos + 1];
19 if (next !== undefined) {
20 heads.push({ key: key(next), stream: head.stream, pos: head.pos + 1 });
21 }
22 }
23 return merged;
24}
Call stack & variables
mergeKStreams paused here
streams{ github: [ 1, 4, 9, 11 ], jira: [ 2, 6, 12 ], cursor: [ 3, 5, 8, 14 ], anthropic: [ 7, 10, 13 ] }
heads[]
min-heap of the k heads parent(i) = (i−1)>>1 · kids 2i+1, 2i+2
k sorted streams → one merged feed ▲ = this stream’s head, currently in the heap

4 sorted streams come in — one sorted feed must come out

step 1 / 183

Merge k Sorted Lists

You are given k lists, each already sorted ascending. Combine them into one list that is sorted ascending overall.

[[1,4,5], [1,3,4], [2,6]] → [1,1,2,3,4,4,5,6]