https://leetcode.com/problems/merge-k-sorted-lists/

1. Use Divide and Conquer(two pointers):

  1. //24 ms 12.2 MB
  2. /**
  3. * Definition for singly-linked list.
  4. * struct ListNode {
  5. * int val;
  6. * ListNode *next;
  7. * ListNode() : val(0), next(nullptr) {}
  8. * ListNode(int x) : val(x), next(nullptr) {}
  9. * ListNode(int x, ListNode *next) : val(x), next(next) {}
  10. * };
  11. */
  12. class Solution {
  13. public:
  14. ListNode* mergeKLists(vector<ListNode*>& lists) {
  15. if(lists.size()==0) return NULL;
  16. if(lists.size()==1) return lists[0];
  17. int n = lists.size();
  18. int last = n - 1;
  19. int l = 0;
  20. int r = last;
  21. while(l < r){
  22. lists[l] = mergeTwoLists(lists[l], lists[r]);
  23. l++;
  24. r--;
  25. if(l>=r){
  26. last = r;
  27. l = 0;
  28. r = last;
  29. }
  30. }
  31. return lists[0];
  32. }
  33. private:
  34. ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
  35. ListNode* dummy = new ListNode();
  36. ListNode* curr = dummy;
  37. while(l1 && l2){
  38. if(l1->val < l2->val){
  39. curr->next = l1;
  40. l1 = l1->next;
  41. } else {
  42. curr->next = l2;
  43. l2 = l2->next;
  44. }
  45. curr = curr->next;
  46. }
  47. ListNode* rest = l1 ? l1 : l2;
  48. if(rest)
  49. curr->next = rest;
  50. return dummy->next;
  51. }
  52. };