---
# System prepended metadata

title: 'Week 3 Session 1 Walkthrough: Smallest Range Covering Elements from K Lists'

---

# Week 3 Session 1 Walkthrough: Smallest Range Covering Elements from K Lists

[Original Question](https://leetcode.com/problems/smallest-range-covering-elements-from-k-lists/)

## Solution
```python
def smallest_range(nums):
    # store the first element in each list in a min heap
    # we need to store the number, corresponding row for that number, and index in row for that number
    heap = [(row[0], i, 0) for i, row in enumerate(nums)]
    heapq.heapify(heap) # this creates the heap
    
    # Best interval so far with the minimum set to negative infinity and the maximum set to positive infinity
    best_interval = (float("-inf"), float("inf")) 
    
    # go through all the rows to get the current highest number
    curr_max = max(row[0] for row in nums) 

    while heap:
        # removes the next smallest element from the heap
        curr_min, row_num, row_index = heapq.heappop(heap) 
        
        if curr_max - curr_min < best_interval[1] - best_interval[0]:
            best_interval = (curr_min, curr_max)

        if row_index + 1 == len(nums[row_num]):
            return best_interval

        new_elem = nums[row_num][row_index+1]
        curr_max = max(curr_max, new_elem)
        heapq.heappush(heap, (new_elem, row_num, row_index+1))
```