算法-链表排序

约定不等于承诺〃 2024-04-18 08:05 138阅读 0赞

1. 链表排序

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

Example 1:

  • Input: 4->2->1->3
  • Output: 1->2->3->4

Example 2:

  • Input: -1->5->3->4->0
  • Output: -1->0->3->4->5

链接:leetcode 原题

2. 解法

归并排序:

  1. 首先将链表从中部切分为两个部分,不断递归这个过程
  2. 递归回溯的时候将两个链表归并为有序链表
  1. public ListNode sortList(ListNode head) {
  2. return null == head ? null : mergeSort(head);
  3. }
  4. public ListNode mergeSort(ListNode head) {
  5. if (Objects.isNull(head.next)) {
  6. return head;
  7. }
  8. ListNode slow = head;
  9. ListNode fast = head;
  10. ListNode mid = null;
  11. while (null != fast && null != fast.next) {
  12. mid = slow;
  13. fast = fast.next.next;
  14. slow = slow.next;
  15. }
  16. // mid.next == slow, 从链表中间位置将其后的节点断开
  17. mid.next = null;
  18. ListNode node1 = mergeSort(head);
  19. ListNode node2 = mergeSort(slow);
  20. return mergeTwoLists(node1, node2);
  21. }
  22. public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
  23. if (null == l1) return l2;
  24. if (null == l2) return l1;
  25. ListNode dummyHead = new ListNode(0);
  26. ListNode p = dummyHead;
  27. while (null != l1 && null != l2) {
  28. if (l1.val > l2.val) {
  29. p.next = l2;
  30. l2 = l2.next;
  31. } else {
  32. p.next = l1;
  33. l1 = l1.next;
  34. }
  35. p = p.next;
  36. }
  37. p.next = null == l1 ? l2 : l1;
  38. return dummyHead.next;
  39. }

发表评论

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

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

相关阅读

    相关 插入排序算法

    如果数据存储在一段连续的内存上,比如数组中,插入排序算法的实现相信大家都已经非常熟悉,如果要对一个单链表进行插入排序,将会牵扯到大量指针操作。 同时,如果在实现的过

    相关 排序

    前言: 最近总结了一下针对只有头结点的单链表进行排序的几个简单的方法。 交换节点:插入排序,冒泡排序,简单选择排序 交换数据:快速排序 初始化: i