23 - Merge k Sorted Lists

 JAVA

  • public class Merge_k_Sorted_Lists {
    
        public static void main(String[] args) {
    
            Merge_k_Sorted_Lists out = new Merge_k_Sorted_Lists();
            Solution s = out.new Solution();
    
            ListNode l1 = null;
            ListNode l2 = new ListNode(1);
    
            s.mergeKLists(new ListNode[]{l1, l2});
    
        }
    
        public class Solution {
            public ListNode mergeKLists(ListNode[] lists) {
    
                if (lists == null || lists.length == 0) {
                    return null;
                }
    
                // same as merge sort array
                return merge(lists, 0, lists.length - 1);
            }
    
            public ListNode merge(ListNode[] lists, int start, int end) {
    
                // single list
                if (start == end) {
                    return lists[start];
                }
    
                int mid = (end - start) / 2 + start;
                ListNode leftHalf = merge(lists, start, mid);
                ListNode rightHalf = merge(lists, mid + 1, end);
    
                return mergeTwoLists(leftHalf, rightHalf);
            }
    
            // from previous question: 21 Merge Two Sorted Lists
            public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
    
                ListNode dummy = new ListNode(0);
                ListNode current = dummy;
    
                while (l1 != null || l2 != null) {
                    int v1 = (l1 == null ? Integer.MAX_VALUE : l1.val);
                    int v2 = (l2 == null ? Integer.MAX_VALUE : l2.val);
    
                    if (v1 < v2) {
                        current.next = l1;
                        l1 = l1.next;
                    } else {
                        current.next = l2;
                        l2 = l2.next;
                    }
    
                    current = current.next; // now current is the new end node, but still pointing to next node
                    current.next = null; // @note: key, cut this node from l1 or l2
                }
    
                return dummy.next;
            }
        }
    
    }
    
    //////
    
    class Solution_Heap {
    	public ListNode mergeKLists(ListNode[] lists) {
    
    		if (lists == null || lists.length == 0) {
    			return null;
    		}
    
    		ListNode dummy = new ListNode(0);
    		ListNode current = dummy;
    
    		// put 1st of each list to heap
    		PriorityQueue<ListNode> heap = new PriorityQueue<>(
    			(a,b) -> a.val - b.val
    		);
    
    		//
    		Arrays.stream(lists).filter(Objects::nonNull).forEach(heap::offer);
    
    		while (heap.size() != 0) {
    			ListNode polled = heap.poll();
    
    			current.next = polled;
    			current = current.next;
    
    			if (polled.next != null) {
    				heap.offer(polled.next); // @note: heap.offer()参数不能是null
    			}
    		}
    
    		return dummy.next;
    	}
    }
    
    //////
    
    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode() {}
     *     ListNode(int val) { this.val = val; }
     *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
     * }
     */
    class Solution {
        public ListNode mergeKLists(ListNode[] lists) {
            int n = lists.length;
            if (n == 0) {
                return null;
            }
            for (int i = 0; i < n - 1; ++i) {
                lists[i + 1] = mergeLists(lists[i], lists[i + 1]);
            }
            return lists[n - 1];
        }
    
        private ListNode mergeLists(ListNode l1, ListNode l2) {
            ListNode dummy = new ListNode();
            ListNode cur = dummy;
            while (l1 != null && l2 != null) {
                if (l1.val <= l2.val) {
                    cur.next = l1;
                    l1 = l1.next;
                } else {
                    cur.next = l2;
                    l2 = l2.next;
                }
                cur = cur.next;
            }
            cur.next = l1 == null ? l2 : l1;
            return dummy.next;
        }
    }
C++
class Solution {
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        ListNode dummy, *tail = &dummy;
        auto cmp = [](auto a, auto b) { return a->val > b->val; };
        priority_queue<ListNode*, vector<ListNode*>, decltype(cmp)> q(cmp);
        for (auto list : lists) {
            if (list) q.push(list); // avoid pushing NULL list.
        }
        while (q.size()) {
            auto node = q.top();
            q.pop();
            if (node->next) q.push(node->next);
            tail->next = node;
            tail = node;
        }
        return dummy.next;
    }
};

Comments