Leetcode刷题(第148题)——排序链表

x33g5p2x  于2022-03-14 转载在 其他  
字(1.0k)|赞(0)|评价(0)|浏览(378)

一、题目

  1. 给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表
  2. 你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?

二、示例

  1. 输入:head = [4,2,1,3]
  2. 输出:[1,2,3,4]

  1. 输入:head = [-1,5,3,4,0]
  2. 输出:[-1,0,3,4,5]
  1. 输入:head = []
  2. 输出:[]

三、思路
本题的时间复杂度为O(nlogn),所以肯定是使用比较高级的一种排序方式。本题中我们应选择归并排序,此时如何找到中间的节点,然后开始切开呢?所以采用快慢指针来解决。
四、代码

  1. /**
  2. * Definition for singly-linked list.
  3. * function ListNode(val, next) {
  4. * this.val = (val===undefined ? 0 : val)
  5. * this.next = (next===undefined ? null : next)
  6. * }
  7. */
  8. /**
  9. * @param {ListNode} head
  10. * @return {ListNode}
  11. */
  12. var sortList = function(head) {
  13. const rec = (node) => {
  14. if(!node || !node.next) return node
  15. let fast = node
  16. let slow = node
  17. let p = node
  18. while(slow && fast && fast.next) {
  19. fast = fast.next.next
  20. p = slow
  21. slow = slow.next
  22. }
  23. p.next = null
  24. let leftNode = rec(node)
  25. let rightNode = rec(slow)
  26. let res = new ListNode(0)
  27. let t = res
  28. while(leftNode || rightNode) {
  29. if(leftNode && rightNode) {
  30. if(leftNode.val < rightNode.val) {
  31. t.next = leftNode
  32. leftNode = leftNode.next
  33. }else {
  34. t.next = rightNode
  35. rightNode = rightNode.next
  36. }
  37. }else if(leftNode) {
  38. t.next = leftNode
  39. leftNode = leftNode.next
  40. }else {
  41. t.next = rightNode
  42. rightNode = rightNode.next
  43. }
  44. t = t.next
  45. }
  46. return res.next
  47. }
  48. return rec(head)
  49. };

五、总结

相关文章