image.png

思路 使用归并排序

  1. public class Solution{
  2. public ListNode sortList(ListNode head){
  3. //终止条件
  4. if(head==null||head.next==null)
  5. return head;
  6. ListNode prev = null,slow=head,fast=head;
  7. //分为前后两部分
  8. while(fast!=null&&fast.next!=null){
  9. prev = slow;
  10. slow = slow.next;
  11. fast = fast.next.next;
  12. }
  13. prev.next = null;
  14. //分别对前后两部分进行排序
  15. ListNode l1 = sortList(head);
  16. ListNode l2 = sortList(slow);
  17. //对两部分进行合并
  18. return merge(l1,l2);
  19. }
  20. ListNode merge(ListNode l1,ListNode l2){
  21. ListNode dummyHead = new ListNode(0),p=dummyHead;
  22. //合并的过程
  23. while(l1!=null&&l2!=null){
  24. if(l1.val<l2.val){
  25. p.next = l1;
  26. l1 = l1.next;
  27. }else{
  28. p.next = l2;
  29. l2 = l2.next;
  30. }
  31. p = p.next;
  32. }
  33. if(l1!=null)
  34. p.next = l1;
  35. if(l2!=null)
  36. p.next = l2;
  37. return dummyHead.next;
  38. }
  39. }