The purpose of the heap is to give you the minimum, so I'm not sure what the purpose of this for-loop is - `for j := 2 to k`.

My take on the pseudo-code:

    lists[k][?]      // input lists
    c = 0            // index in result
    result[n]        // output
    heap[k]          // stores index and applicable list and uses list value for comparison
                     // if i is the index and k is the list
                     //   it has functions - insert(i, k) and deleteMin() which returns i,k
                     // the reason we use the index and the list, rather than just the value
                     //   is so that we can get the successor of any value

    // populate the initial heap
    for i = 1:k                   // runs O(k) times
      heap.insert(0, k)           // O(log k)

    // keep doing this - delete the minimum, insert the next value from that list into the heap
    while !heap.empty()           // runs O(n) times
      i,k = heap.deleteMin();     // O(log k)
      result[c++] = lists[k][i]
      i++
      if (i < lists[k].length)    // insert only if not end-of-list
        heap.insert(i, k)         // O(log k)

The total time complexity is thus $O(k * \log k + n * 2 \log k) = O(n \log k)$

You can also, instead of `deleteMin` and `insert`, have a `getMin` ($O(1)$) and an `incrementIndex` ($O(\log k)$), which will reduce the constant factor, but not the complexity.