public static List <int> SortedMerge(int[][] files) { BinaryMaxHeap <LineItem> heap = new BinaryMaxHeap <LineItem>(); List <int> result = new List <int>(); for (int i = 0; i < files.Length; i++) { if (files[i].Length > 0) { int value = files[i][0]; heap.Push(value, new LineItem(value: value, fileNum: i, nextIndex: 1)); } } while (heap.Count > 0) { LineItem item = heap.Pop(); result.Add(item.Value); int fileNum = item.FileNum; int fileIndex = item.NextIndex; if (fileIndex < files[fileNum].Length) { int value = files[fileNum][fileIndex]; heap.Push(value, new LineItem(value, fileNum, fileIndex + 1)); } } return(result); }