1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 10 struct helper { 11 ListNode *head; 12 int len; 13 helper(ListNode *h, int l) : head ( h ), len ( l ) {} 14 }; 15 16 class helpercmp { 17 public: 18 bool operator() (const helper &a, const helper &b) { 19 return a.len > b.len; 20 } 21 }; 22 23 class Solution { 24 public: 25 priority_queue<helper, vector<helper>, helpercmp> heap; 26 27 inline int listSize(ListNode *head) { 28 int len = 0; 29 for ( ; head != nullptr; head = head->next, len++ ); 30 return len; 31 } 32 ListNode *mergeKLists(vector<ListNode *> &lists) { 33 if ( lists.empty() ) return nullptr; 34 if ( lists.size() == 1 ) return lists[0]; 35 ListNode *head = nullptr, *left = nullptr, *right = nullptr; 36 for ( auto list : lists ) { 37 heap.push( helper(list, listSize(list) ) ); 38 } 39 while ( heap.size() != 1 ) { 40 left = heap.top().head; 41 heap.pop(); 42 right = heap.top().head; 43 heap.pop(); 44 head = mergeList( left, right ); 45 heap.push( helper( head, listSize(head) ) ); 46 } 47 return heap.top().head; 48 } 49 ListNode *mergeList(ListNode *a, ListNode *b) { 50 ListNode dummy(0); 51 ListNode *tail = &dummy; 52 while ( a != nullptr && b != nullptr ) { 53 if ( a-> val <= b->val ) { 54 tail->next = a; 55 a = a->next; 56 } else { 57 tail->next = b; 58 b = b->next; 59 } 60 tail = tail->next; 61 } 62 tail->next = a == nullptr ? b : a; 63 return dummy.next; 64 } 65 };