题意:

image.png

解题思路:

  1. 思路:
  2. 1. 快速排序 Time: O(n*logn), Space: O(n)
  3. 2. 归并排序 Time: O(n*logn) Space: O(logn)

PHP代码实现:

  1. /**
  2. * Definition for a singly-linked list.
  3. * class ListNode {
  4. * public $val = 0;
  5. * public $next = null;
  6. * function __construct($val = 0, $next = null) {
  7. * $this->val = $val;
  8. * $this->next = $next;
  9. * }
  10. * }
  11. */
  12. class Solution {
  13. /**
  14. * @param ListNode $head
  15. * @return ListNode
  16. */
  17. function sortList($head) {
  18. /*$this->quickSort($head, null);
  19. return $head;*/
  20. if ($head == null || $head->next == null) return $head;
  21. $slow = $head; $fast = $head;
  22. while ($fast->next != null && $fast->next->next != null) {
  23. $slow = $slow->next;
  24. $fast = $fast->next->next;
  25. }
  26. $tail = $slow->next;
  27. $slow->next = null;
  28. $left = $this->sortList($head);
  29. $right = $this->sortList($tail);
  30. return $this->mergeTwoList($left, $right);
  31. }
  32. function mergeTwoList($l1, $l2) {
  33. $dummy = new ListNode(0);
  34. $cur = $dummy;
  35. while ($l1 != null && $l2 != null) {
  36. if ($l1->val < $l2->val) {
  37. $cur->next = $l1;
  38. $l1 = $l1->next;
  39. } else {
  40. $cur->next = $l2;
  41. $l2 = $l2->next;
  42. }
  43. $cur = $cur->next;
  44. }
  45. $cur->next = $l1 == null ? $l2 : $l1;
  46. return $dummy->next;
  47. }
  48. function quickSort($head, $end) {
  49. if ($head == $end || $head->next == $end) return;
  50. $pivot = $head->val;
  51. $slow = $head;
  52. $fast = $head->next;
  53. while ($fast != $end) {
  54. if ($fast->val <= $pivot) {
  55. $slow = $slow->next;
  56. $this->swap($slow, $fast);
  57. }
  58. $fast = $fast->next;
  59. }
  60. $this->swap($head, $slow);
  61. $this->quickSort($head, $slow);
  62. $this->quickSort($slow->next, $end);
  63. }
  64. function swap(&$a, &$b) {
  65. $temp = $a->val;
  66. $a->val = $b->val;
  67. $b->val = $temp;
  68. }
  69. }

GO代码实现:

  1. /**
  2. * Definition for singly-linked list.
  3. * type ListNode struct {
  4. * Val int
  5. * Next *ListNode
  6. * }
  7. */
  8. func sortList(head *ListNode) *ListNode {
  9. quickSort(head, nil)
  10. return head
  11. }
  12. func swap(a, b *ListNode) {
  13. a.Val, b.Val = b.Val, a.Val
  14. }
  15. func quickSort(head, end *ListNode) {
  16. if head == end || head.Next == end {
  17. return
  18. }
  19. pivot := head.Val
  20. slow, fast := head, head.Next
  21. for fast != end {
  22. if fast.Val <= pivot {
  23. slow = slow.Next
  24. //swap(slow, fast)
  25. slow.Val, fast.Val = fast.Val, slow.Val
  26. }
  27. fast = fast.Next
  28. }
  29. //循环结束后交换头节点和慢指针指向的值,把pivot放在大小两堆数值的中间
  30. //swap(head, slow)
  31. slow.Val, head.Val = head.Val, slow.Val
  32. quickSort(head, slow) // 递归处理pivot左右两边的链表
  33. quickSort(slow.Next, end)
  34. }
  1. // 单链表归并排序 Time: O(n*logn) Space: O(logn)
  2. func mergeSortList(head *ListNode) *ListNode {
  3. if head == nil || head.Next == nil {
  4. return head
  5. }
  6. slow, fast := head, head // 快慢指针初始化在链表头
  7. for fast.Next != nil && fast.Next.Next != nil {
  8. slow = slow.Next // 慢指针一次走一步
  9. fast = fast.Next.Next // 快指针一次走两步
  10. }
  11. // 循环结束后慢指针指向的是前一半链表的最后一个元素
  12. right := mergeSortList(slow.Next) // 先排序后一段链表
  13. slow.Next = nil // 然后把慢指针的Next置为空指针
  14. left := mergeSortList(head) // 再排序前一段链表
  15. return mergeTwoSortedLists(left, right) // 合并排序后的两段链表
  16. }
  17. func mergeTwoSortedLists(l1, l2 *ListNode) *ListNode {
  18. dummy := new(ListNode)
  19. p := dummy
  20. for l1 != nil && l2 != nil {
  21. if l1.Val < l2.Val {
  22. p.Next = l1
  23. l1 = l1.Next
  24. } else {
  25. p.Next = l2
  26. l2 = l2.Next
  27. }
  28. p = p.Next
  29. }
  30. if l1 != nil {
  31. p.Next = l1
  32. }
  33. if l2 != nil {
  34. p.Next = l2
  35. }
  36. return dummy.Next
  37. }