【leetcode每日一题】148.sort List

红太狼 2022-08-04 14:36 231阅读 0赞

题目:Sort a linked list in O(n log n) time using constant space complexity.

解析:题目要求是对链表进行排序,但是复杂度不能超过O(nlgn)。符合题意的常见排序方法有快排、归并排序和堆排序。以下是用归并排序解决此题的步骤。

1)将链表从中间部分分为两个链表。具体做法是:声明两个指针,一个快指针和一个慢指针,当快指针指向NULL时,慢指针指向中间节点。

2)对左右链表进行递归,直到链表只剩一个节点为止。

3)调用归并函数,对两个链表进行归并。归并函数的实现思路,请见第21题:Merge two sorted lists http://blog.csdn.net/kevin\_zhai/article/details/47439123

代码如下:

  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. class Solution {
  10. public:
  11. ListNode *sortList(ListNode *head) {
  12. if(head==NULL||head->next==NULL)
  13. return head;
  14. return mergesort(head);
  15. }
  16. ListNode *mergesort(ListNode *head)
  17. {
  18. if(head==NULL||head->next==NULL)
  19. return head;
  20. ListNode *fast=head,*slow=head;
  21. ListNode *leftHalf,*rightHalf,*pre;
  22. while(fast!=NULL&&fast->next!=NULL)
  23. {
  24. fast=fast->next->next;
  25. pre=slow;
  26. slow=slow->next;
  27. }
  28. pre->next=NULL;
  29. leftHalf=mergesort(head);
  30. rightHalf=mergesort(slow);
  31. return merge(leftHalf,rightHalf);
  32. }
  33. ListNode *merge(ListNode *leftHalf,ListNode *rightHalf)
  34. {
  35. ListNode *result=new ListNode(0);
  36. ListNode *temp=result;
  37. while(leftHalf!=NULL&&rightHalf!=NULL)
  38. {
  39. if(leftHalf->val<rightHalf->val)
  40. {
  41. temp->next=leftHalf;
  42. temp=temp->next;
  43. leftHalf=leftHalf->next;
  44. }
  45. else
  46. {
  47. temp->next=rightHalf;
  48. temp=temp->next;
  49. rightHalf=rightHalf->next;
  50. }
  51. }
  52. if(leftHalf!=NULL)
  53. temp->next=leftHalf;
  54. if(rightHalf!=NULL)
  55. temp->next=rightHalf;
  56. temp=result->next;
  57. //delete result;
  58. return temp;
  59. }
  60. };

发表评论

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

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

相关阅读