23 合并k个有序链表

  1. /**
  2. * Definition for singly-linked list.
  3. * public class ListNode {
  4. * int val;
  5. * ListNode next;
  6. * ListNode() {}
  7. * ListNode(int val) { this.val = val; }
  8. * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
  9. * }
  10. */
  11. class Solution {
  12. public ListNode mergeKLists(ListNode[] lists) {
  13. return sortLists(lists, 0, lists.length - 1);
  14. }
  15. private ListNode sortLists(ListNode[] lists, int left, int right) {
  16. if (left > right)
  17. return null;
  18. if (left == right)
  19. return lists[left];
  20. int mid = (left + right) >> 1;
  21. return merge(sortLists(lists, left, mid), sortLists(lists, mid + 1, right));
  22. }
  23. private ListNode merge(ListNode l1, ListNode l2) {
  24. ListNode dummyHead = new ListNode();
  25. ListNode p = dummyHead;
  26. while (l1 != null && l2 != null) {
  27. if (l1.val <= l2.val) {
  28. p.next = l1;
  29. l1 = l1.next;
  30. }
  31. else {
  32. p.next = l2;
  33. l2 = l2.next;
  34. }
  35. p = p.next;
  36. }
  37. if (l1 != null)
  38. p.next = l1;
  39. else
  40. p.next = l2;
  41. return dummyHead.next;
  42. }
  43. }