排序链表

落日映苍穹つ 2022-10-01 12:57 283阅读 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

解法

思路1,归并排序

  1. public ListNode sortList(ListNode head) {
  2. if(head == null || head.next==null) {
  3. return head;
  4. }
  5. //获取中间节点
  6. ListNode mid = findMid(head);
  7. //左右分别递归进行排序
  8. ListNode right = sortList(mid.next);
  9. mid.next =null;
  10. ListNode left = sortList(head);
  11. //最终进行merge
  12. return merge(left, right);
  13. }
  14. ListNode merge(ListNode firstNode, ListNode secondNode) {
  15. //哑结点
  16. ListNode head = new ListNode(0);
  17. ListNode cur = head, first = firstNode, second = secondNode;
  18. while(first != null && second !=null) {
  19. while(first != null && first.val < second.val) {
  20. cur.next = first;
  21. cur = cur.next;
  22. first = first.next;
  23. }
  24. while(first != null && second !=null && first.val >= second.val) {
  25. cur.next = second;
  26. cur = cur.next;
  27. second = second.next;
  28. }
  29. }
  30. if(first != null) {
  31. cur.next = first;
  32. }else if (second !=null) {
  33. cur.next = second;
  34. }
  35. return head.next;
  36. }
  37. ListNode findMid(ListNode head) {
  38. ListNode slowNode = head, fastNode = head.next;
  39. while(fastNode != null && fastNode.next!=null) {
  40. slowNode = slowNode.next;
  41. fastNode = fastNode.next.next;
  42. }
  43. return slowNode;
  44. }

发表评论

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

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

相关阅读

    相关 排序--归并排序

    要求在空间复杂度为O(1)的情况下对链表进行排序,在不考虑时间复杂度的情况下可以考虑冒泡排序,只对链表中的值进行操作,这样时间复杂度为O(n^2)。用归并排序,时间复杂度为O(

    相关 排序

    算法思想:采用直接插入排序算法的思想,先构成只含一个数据结点的有序单链表,然后一次扫描剩下的结点p(直至p==NULL为止),在有序表中通过比较查找插入p的前驱结点pre,然后

    相关 排序-归并

    链表排序,可以插入排序,我就不写了。 实现归并排序 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Con

    相关 排序

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