JIAKAOBO

LeetCode

venmo
wechat

感谢赞助!

  • ㊗️
  • 大家
  • offer
  • 多多!

Problem

You are given an array of k linked-lists lists, each linked-list is sorted in ascending order.

Merge all the linked-lists into one sorted linked-list and return it.

Example 1:

Input: lists = [[1,4,5],[1,3,4],[2,6]]
Output: [1,1,2,3,4,4,5,6]
Explanation: The linked-lists are:
[
  1->4->5,
  1->3->4,
  2->6
]
merging them into one sorted list:
1->1->2->3->4->4->5->6

Example 2:

Input: lists = []
Output: []

Example 3:

Input: lists = [[]]
Output: []

Constraints:

  • k == lists.length
  • $0 <= k <= 10^4$
  • 0 <= lists[i].length <= 500
  • $-10^4 <= lists[i][j] <= 10^4$
  • lists[i] is sorted in ascending order.
  • The sum of lists[i].length will not exceed $10^4$.

Code

class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        if(lists.length == 0){
            return null;
        }
        
        int interval = 1;
        while(interval < lists.length){
            for (int i = 0; i + interval < lists.length; i = i + interval * 2) {
                lists[i] = mergeTwoLists(lists[i], lists[i + interval]);            
            }
            
            interval *= 2;
        }

        return lists[0];
    }
    
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        ListNode dummy = new ListNode(0);
        ListNode curr = dummy;
        
        while (l1 != null && l2 != null) {
            if (l1.val < l2.val) {
                curr.next = l1;
                l1 = l1.next;
            } else {
                curr.next = l2;
                l2 = l2.next;
            }
            curr = curr.next;
        }
        
        if(l1 == null){
            curr.next = l2;
        }
        
        if(l2 == null){
            curr.next = l1;
        } 
        
        return dummy.next;
    }
}
class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        PriorityQueue<ListNode> queue = new PriorityQueue<>((a, b) -> (a.val - b.val));
        
        for(ListNode l : lists) {
            if(l != null) {
                queue.offer(l);
            }
        }
        
        ListNode dummy = new ListNode(0);
        ListNode curr = dummy;
        
        while(!queue.isEmpty()) {
            ListNode temp = queue.poll();
            curr.next = new ListNode(temp.val);
            curr = curr.next;
            if(temp.next != null) {
                queue.offer(temp.next);
            }
        }
        
        return dummy.next;
    }
}