题干
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
示例 1:
输入: 4->2->1->3
输出: 1->2->3->4
示例 2:
输入: -1->5->3->4->0
输出: -1->0->3->4->5
想法
O(n log n) 自然想到快排,但是这个快排我没写出来,选用了更合适的分治归并递归
直接看代码就行了
思路参考https://www.cnblogs.com/yanhowever/p/11956638.html
java代码/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode sortList(ListNode head) {
//空或者只有一个节点
if (head == null || head.next == null)
return head;
ListNode fast = head.next, slow = head;
while (fast != null && fast.next != null) {//通过快慢指针来取得中间数,很重要的一种方法
slow = slow.next;
fast = fast.next.next;
}
ListNode tmp = slow.next;
slow.next = null;//隔断
ListNode left = sortList(head);
ListNode right = sortList(tmp);
ListNode h = new ListNode(0);
ListNode res = h;
//合并
while(left!=null&&right!=null){
if (left.val < right.val) {
h.next = left;
left = left.next;
} else {
h.next=right;
right=right.next;
}
h=h.next;
}
h.next = left != null ? left : right;
return res.next;
}
}