链表排序算法(归并和快排)

你的名字 2022-09-14 15:15 316阅读 0赞

链表排序算法(归并和快排)

  • 归并
  • 快排

归并

  1. class Solution
  2. {
  3. public:
  4. ListNode *sortList(ListNode *head)
  5. {
  6. if (head == NULL || head->next == NULL)
  7. {
  8. return head;
  9. }
  10. return mergeSort(head);
  11. }
  12. ListNode *mergeSort(ListNode *head)
  13. {
  14. if (head == NULL)
  15. {
  16. return NULL;
  17. }
  18. if (head->next == NULL)
  19. {
  20. return head;
  21. }
  22. ListNode *slow = head;
  23. ListNode *fast = head->next;
  24. while (fast && fast->next)
  25. {
  26. slow = slow->next;
  27. fast = fast->next->next;
  28. }
  29. ListNode *r_head = slow->next;
  30. slow->next = NULL;
  31. ListNode *left = mergeSort(head);
  32. ListNode *right = mergeSort(r_head);
  33. return mergeTogether(left, right);
  34. }
  35. ListNode *mergeTogether(ListNode *head1, ListNode *head2)
  36. {
  37. if (head1 == NULL)
  38. {
  39. return head2;
  40. }
  41. if (head2 == NULL)
  42. {
  43. return head1;
  44. }
  45. ListNode *root = new ListNode(0);
  46. ListNode *h = root;
  47. while (head1 && head2)
  48. {
  49. if (head1->val < head2->val)
  50. {
  51. h->next = head1;
  52. head1 = head1->next;
  53. }
  54. else
  55. {
  56. h->next = head2;
  57. head2 = head2->next;
  58. }
  59. h = h->next;
  60. }
  61. if (head1)
  62. {
  63. h->next = head1;
  64. }
  65. if (head2)
  66. {
  67. h->next = head2;
  68. }
  69. return root->next;
  70. }
  71. };

快排

  1. void quickSort(ListNode *head, ListNode *tail)
  2. {
  3. if(head==tail||head->next==tail)
  4. {
  5. return;
  6. }
  7. int pivot = head->val;
  8. ListNode *left = head;
  9. ListNode *cur = head->next;
  10. while(cur!=tail)
  11. {
  12. if(cur->val<pivot)
  13. {
  14. left = left->next;
  15. swap(left->val, cur->val);
  16. }
  17. cur = cur->next;
  18. }
  19. swap(left->val, head->val);
  20. quickSort(head, left);
  21. quickSort(left->next, tail);
  22. }
  23. ListNode *sortList(ListNode *head)
  24. {
  25. if (head == NULL || head->next == NULL)
  26. {
  27. return head;
  28. }
  29. quickSort(head, NULL);
  30. return head;
  31. }

发表评论

表情:
评论列表 (有 0 条评论,316人围观)

还没有评论,来说两句吧...

相关阅读

    相关 排序算法】-算法

    前言 笔者也是近期猜对算法感兴趣的,可能对刚入门的同学来说,算法接触不到,但是对于有一些经验的程序员来说,算法的技能是必备的,尤其是面试的时候,动不动就让你手写算法,其实