链表排序--归并排序

£神魔★判官ぃ 2022-06-07 07:10 304阅读 0赞

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

  1. public ListNode sortList(ListNode head) {
  2. if(head == null || head.next == null)
  3. return head;
  4. ListNode mid = getMidNode(head);
  5. ListNode next = mid.next;
  6. mid.next = null;
  7. ListNode left = sortList(head);
  8. ListNode right = sortList(next);
  9. head = MergeListNode(left, right);
  10. return head;
  11. }
  12. private static ListNode getMidNode(ListNode head){
  13. if(head == null || head.next == null)
  14. return null;
  15. ListNode fast = head.next;
  16. ListNode slow = head;
  17. while(fast != null && fast.next!= null){
  18. slow = slow.next;
  19. fast = fast.next.next;
  20. }
  21. return slow;
  22. }
  23. private static ListNode MergeListNode(ListNode left, ListNode right){
  24. ListNode temp = new ListNode(0);
  25. ListNode temp_node = temp;
  26. while(left != null && right != null){
  27. if(left.val < right.val){
  28. temp_node.next = left;
  29. left = left.next;
  30. }else{
  31. temp_node.next = right;
  32. right = right.next;
  33. }
  34. temp_node = temp_node.next;
  35. }
  36. if(left != null)
  37. temp_node.next = left;
  38. if(right != null)
  39. temp_node.next = right;
  40. return temp.next;
  41. }

发表评论

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

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

相关阅读

    相关 归并排序和插入排序

    由于最近在学习数据结构和算法,在牛客网 的在线编程题上遇到了对链表的相关排序操作,发现自己对链表这块还是理解不够深入,以前做过对数组进行排序,但链表的操作要比数组复杂一些,毕竟

    相关 排序--归并排序

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

    相关 排序-归并

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