当前位置:   article > 正文

Believing Process 力扣Hot148.排序链表_hothot148

hothot148

题干:

给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。

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

  1. public static ListNode sortList(ListNode head) {
  2. if(head==null||head.next==null) return head;
  3. ListNode fast = head;
  4. ListNode slow = head;
  5. while (fast.next!=null&&fast.next.next!=null){
  6. //快指针走两步,慢指针走一步
  7. fast = fast.next.next;
  8. slow = slow.next;
  9. }
  10. ListNode temp = slow.next;
  11. slow.next = null;
  12. //左右递归接着拆分
  13. ListNode left = sortList(head);
  14. ListNode right = sortList(temp);
  15. //用于返回结果的指针
  16. ListNode dumpy = new ListNode(0);
  17. //用于遍历的指针
  18. ListNode prev = dumpy;
  19. while(left!=null&&right!=null){
  20. //左链表的值小,拼接左链表
  21. if(left.val<=right.val){
  22. prev.next = left;
  23. left = left.next;
  24. }
  25. //右链表的值小,拼接右链表
  26. else{
  27. prev.next = right;
  28. right = right.next;
  29. }
  30. //拼接完一个节点,移动遍历指针
  31. prev = prev.next;
  32. }
  33. //如果左链表有剩余元素,就拼接左链表,否则拼接右链表
  34. prev.next = left!=null? left:right;
  35. //返回结果
  36. return dumpy.next;
  37. }

 归并排序,首先用快慢指针找到当前链表的中点,快指针走两步,慢指针走一步,(注意fast.next!=null&&fast.next.next!=null有区别),然后用一个临时节点temp表示中点的后一个节点,且以这个temp节点作为分割后第二个链表的头节点,继续递归左右两个链表,用一个dumpy节点表示后续需要返回的头节点,prev节点表示遍历中的节点,然后按照节点值小的在前,依次将左右链表中的节点拼接起来,最后如果左右链表还有剩余,则全部拼接起来。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/506305
推荐阅读
相关标签
  

闽ICP备14008679号