148. 排序链表

image.png

  1. class Solution {
  2. public ListNode sortList(ListNode head) {
  3. if (head == null || head.next == null) return head;
  4. ListNode p = head, q = head;
  5. //注意:要保证p在左半区的最后一个,如两个节点的左边一个。
  6. while (p.next != null && p.next.next != null) {
  7. p = p.next.next;
  8. q = q.next;
  9. }
  10. ListNode next = q.next;
  11. q.next = null;
  12. ListNode l1 = sortList(head);
  13. ListNode l2 = sortList(next);
  14. return merge(l1, l2);
  15. }
  16. private ListNode merge(ListNode l1, ListNode l2) {
  17. ListNode dummy = new ListNode(-1);
  18. ListNode cur = dummy;
  19. while (l1 != null && l2 != null) {
  20. if (l1.val < l2.val) {
  21. cur.next = l1;
  22. l1 = l1.next;
  23. } else {
  24. cur.next = l2;
  25. l2 = l2.next;
  26. }
  27. cur = cur.next;
  28. }
  29. cur.next = l1 == null ? l2 : l1;
  30. return dummy.next;
  31. }
  32. }