[leetcode]148. Sort List -- JavaScript代码

柔情只为你懂 2022-09-25 09:22 244阅读 0赞

题目要求时间复杂度为O(nlogn)并且空间复杂度为O(1):归并排序的时间复杂度合格,并且由于这是链表排序,因此,空间复杂度也可以做到O(1)。

关于归并排序,百度上有现成的代码,本题我采用的是递归的方式。不过这道题需要我们根据链表的特点做一些修改:例如,找中间节点的函数,需要使用快慢指针的方法,以完成高效的查找中间指针。

  1. /** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.next = null; * } */
  2. /** * @param {ListNode} head * @return {ListNode} */
  3. var sortList = function(head) {
  4. // 归并排序的时间复杂度为O(nlogn)
  5. if(head===null){
  6. return head;
  7. }
  8. ret = mergeSort(head);
  9. return ret;
  10. function mergeSort(items){
  11. // 归并算法
  12. if(items.next===null){
  13. return items;
  14. }
  15. var left = items;
  16. var right = getMid(items);
  17. return merge(mergeSort(left), mergeSort(right));
  18. }
  19. function merge(left,right){
  20. // 合并
  21. var merge_result;
  22. if(left===null){
  23. return right;
  24. }else if(right===null){
  25. return left;
  26. }
  27. if(left.val<right.val){
  28. lead = left;
  29. left = left.next;
  30. }else{
  31. lead = right;
  32. right = right.next;
  33. }
  34. var tmp = lead;
  35. while(left!==null && right!==null){
  36. if(left.val<right.val){
  37. tmp.next = left;
  38. tmp = left;
  39. left = left.next;
  40. }else{
  41. tmp.next = right;
  42. tmp = right;
  43. right = right.next;
  44. }
  45. }
  46. if(left!==null){
  47. tmp.next = left;
  48. }else{
  49. tmp.next = right;
  50. }
  51. return lead;
  52. }
  53. function getMid(first){
  54. // 快慢指针获得中间点
  55. //guaranteed that at least two nodes
  56. var fast = first.next;
  57. var slow = first.next;
  58. var prev = first;
  59. while(true)
  60. {
  61. if(fast !== null)
  62. fast = fast.next;
  63. else
  64. break;
  65. if(fast !== null)
  66. fast = fast.next;
  67. else
  68. break;
  69. prev = slow;
  70. slow = slow.next;
  71. }
  72. prev.next = null; // cut
  73. return slow;
  74. }
  75. };

发表评论

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

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

相关阅读