LeetCode 23. Merge k Sorted Lists
最简单的思路,如果lists.size()<=1,可直接处理;否则每次取lists最开始的两个节点,进行merge,然后push_back,同时删去最开始的两个节点,一直循环知道lists只剩下一个节点。
地狱般的460ms,更好更快算法待看,留坑。
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 class Solution { 10 public: 11 ListNode* mergeTwo(ListNode* a, ListNode* b){ 12 ListNode* head = new ListNode(0); 13 ListNode* res = head; 14 while(a && b){ 15 if(a->val < b->val){ 16 ListNode* tmp = a->next; 17 head->next = a; 18 a = tmp; 19 head = head->next; 20 } 21 else{ 22 ListNode* tmp = b->next; 23 head->next = b; 24 b = tmp; 25 head = head->next; 26 } 27 } 28 while(a){ 29 ListNode* tmp = a->next; 30 head->next = a; 31 a = tmp; 32 head = head->next; 33 } 34 while(b){ 35 ListNode* tmp = b->next; 36 head->next = b; 37 b = tmp; 38 head = head->next; 39 } 40 return res->next; 41 } 42 ListNode* mergeKLists(vector<ListNode*>& lists) { 43 if(lists.size() < 1) return NULL; 44 if(lists.size() == 1) return lists[0]; 45 // ListNode* resH(NULL); 46 while(true){ 47 if(lists.size() == 1) break; 48 lists.push_back(mergeTwo(lists[0],lists[1])); 49 lists.erase(lists.begin()); 50 lists.erase(lists.begin()); 51 } 52 53 return lists[0]; 54 } 55 };