1. <?php
    2. Class ListNode {
    3. public $val = 0;
    4. public $next;
    5. public function __construct($val) {
    6. $this->val = $val;
    7. }
    8. }
    9. class Solution {
    10. // 分治
    11. public function mergeKLists1($lists) {
    12. return $this->handle($lists, 0, count($lists) - 1);
    13. }
    14. private function handle($list, $left, $right) {
    15. if ($left >= $right) return $list[$left];
    16. $mid = floor(($right - $left) / 2) + $left;
    17. $l1 = $this->handle($list, $left, $mid);
    18. $l2 = $this->handle($list, $mid + 1, $right);
    19. return $this->mergeTwoLists($l1, $l2);
    20. }
    21. private function mergeTwoLists(ListNode $l1, ListNode $l2) : ListNode {
    22. if (!$l1) return $l2;
    23. if (!$l2) return $l1;
    24. $dummyHead = new ListNode(0);
    25. $current = $dummyHead;
    26. while ($l1 || $l2) {
    27. if (!$l1) {
    28. $current->next = $l2;
    29. break;
    30. }
    31. if (!$l2) {
    32. $current->next = $l1;
    33. break;
    34. }
    35. if ($l1->val < $l2->val) {
    36. $current->next = $l1;
    37. $current = $current->next;
    38. $l1 = $l1->next;
    39. } else {
    40. $current->next = $l2;
    41. $current = $current->next;
    42. $l2 = $l2->next;
    43. }
    44. }
    45. return $dummyHead->next;
    46. }
    47. // 小顶堆
    48. public function mergeKLists2($lists) {
    49. $dummyHead = new ListNode(0);
    50. $current = $dummyHead;
    51. $minHeap = new SplMinHeap();
    52. if ($lists) {
    53. foreach ($lists as $l) {
    54. $minHeap->insert($l);
    55. }
    56. }
    57. while (!$minHeap->isEmpty()) {
    58. $l = $minHeap->top();
    59. $minHeap->next();
    60. if ($l->next != null) {
    61. $minHeap->insert($l->next);
    62. }
    63. if ($l) {
    64. $current->next = $l;
    65. $current = $current->next;
    66. }
    67. }
    68. return $dummyHead->next;
    69. }
    70. }
    71. $elem1 = new ListNode(1);
    72. $elem1->next = new ListNode(4);
    73. $elem1->next->next = new ListNode(5);
    74. $elem2 = new ListNode(1);
    75. $elem2->next = new ListNode(3);
    76. $elem2->next->next = new ListNode(4);
    77. $elem3 = new ListNode(2);
    78. $elem3->next = new ListNode(6);
    79. $lists = [$elem1, $elem2, $elem3];
    80. $cls = new Solution();
    81. // 分治
    82. // $r = $cls->mergeKLists1($lists);
    83. // print_r($r);
    84. // 小顶堆
    85. $r = $cls->mergeKLists2($lists);
    86. print_r($r);