148. 排序链表(一般)
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。
进阶:
你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?
示例 1:
1 2
| 输入:head = [4,2,1,3] 输出:[1,2,3,4]
|
示例 2:
1 2
| 输入:head = [-1,5,3,4,0] 输出:[-1,0,3,4,5]
|
示例 3:
提示:
链表中节点的数目在范围 [0, 5 * 104] 内
-105 <= Node.val <= 105
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sort-list
思路
- 先找中间节点,断开
- 递归下探
- 合并有序链表
代码1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
|
class Solution { public ListNode sortList(ListNode head) { if (head == null || head.next == null) { return head; }
ListNode midNode = middleNode(head); ListNode rightHead = midNode.next; midNode.next = null;
ListNode left = sortList(head); ListNode right = sortList(rightHead);
return mergeTwoLists(left, right); } private ListNode middleNode(ListNode head) { if (head == null || head.next == null) { return head; } ListNode slow = head; ListNode fast = head.next.next;
while (fast != null && fast.next != null) { slow = slow.next; fast = fast.next.next; }
return slow; }
public ListNode mergeTwoLists(ListNode l1, ListNode l2) { if (l1 == null || l2 == null) { return l1 != null ? l1 : l2; } ListNode l3 = new ListNode(); ListNode l4 = l3; while(l1 !=null && l2!=null){ if(l1.val<=l2.val){ l3.next = l1; l1 = l1.next; }else{ l3.next = l2; l2 = l2.next; } l3 = l3.next; } l3.next = l1==null?l2:l1; return l4.next; } }
|