LeetCode 148.Sort List (排序链表)

╰半橙微兮° 2022-05-08 13:33 329阅读 0赞

题目描述:

O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。

示例 1:

  1. 输入: 4->2->1->3
  2. 输出: 1->2->3->4

示例 2:

  1. 输入: -1->5->3->4->0
  2. 输出: -1->0->3->4->5

AC C++ Solution:

归并排序:

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * ListNode *next;
  6. * ListNode(int x) : val(x), next(NULL) {}
  7. * };
  8. */
  9. //归并排序
  10. /**
  11. * Merge sort use bottom-up policy,
  12. * so Space Complexity is O(1)
  13. * Time Complexity is O(NlgN)
  14. * stable sort
  15. */
  16. class Solution {
  17. public:
  18. ListNode *sortList(ListNode *head) {
  19. if(!head || !(head->next)) return head;
  20. //获得链表长度
  21. ListNode* cur = head;
  22. int length = 0;
  23. while(cur){
  24. length++;
  25. cur = cur->next;
  26. }
  27. ListNode dummy(0);
  28. dummy.next = head;
  29. ListNode *left, *right, *tail;
  30. for(int step = 1; step < length; step <<= 1){ //step成2的指数倍增加(1,2,4,8...)归并
  31. cur = dummy.next;
  32. tail = &dummy;
  33. while(cur){
  34. left = cur; //left第一个列表头部
  35. right = split(left, step); //right第二个列表头部
  36. cur = split(right,step); //再次分裂,cur为下次归并的头部
  37. tail = merge(left, right, tail); //归并并返回归并后的尾部,作为下次归并的头
  38. }
  39. }
  40. return dummy.next;
  41. }
  42. private:
  43. /*
  44. 将链表分成两个列表,第一个包含前n个节点,返回第二个列表的头部
  45. */
  46. ListNode* split(ListNode *head, int n){
  47. //if(!head) return NULL;
  48. for(int i = 1; head && i < n; i++) head = head->next;
  49. if(!head) return NULL;
  50. ListNode *second = head->next;
  51. head->next = NULL;
  52. return second;
  53. }
  54. /*
  55. 合并两个已排序的链表l1和l2,
  56. 然后将合并的已排序链表追加到头节点
  57. 然后合并排序链表的尾部
  58. */
  59. ListNode* merge(ListNode* l1, ListNode* l2, ListNode* head){
  60. ListNode *cur = head;
  61. while(l1 && l2){
  62. if(l1->val > l2->val){
  63. cur->next = l2;
  64. cur = l2;
  65. l2 = l2->next;
  66. }
  67. else{
  68. cur->next = l1;
  69. cur = l1;
  70. l1 = l1->next;
  71. }
  72. }
  73. cur->next = (l1 ? l1 : l2);
  74. while(cur->next) cur = cur->next;
  75. return cur;
  76. }
  77. };

left(cur)——right——nextcur—————-

发表评论

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

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

相关阅读