Raymond于2019.12.04晚,第一篇CSDN博客。
题目描述
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
示例 1:
输入: 4->2->1->3
输出: 1->2->3->4
示例 2:
输入: -1->5->3->4->0
输出: -1->0->3->4->5
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sort-list
参考:https://blog.csdn.net/mine_song/article/details/69831827
代码
/**
* 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;
ListNode slow = head;
while (fast.next != null){
fast = fast.next.next;
if (fast == null){
break;
}
slow = slow.next;
}
ListNode right = slow.next;
slow.next = null;
ListNode left = sortList(head);
right = sortList(right);
return mergeTwoList(left, right);
}
// 递归实现两个链的合并
public ListNode mergeTwoList(ListNode left, ListNode right){
if (left == null) return right;
if (right == null) return left;
ListNode res = null;
if (left.val <= right.val){
res = left;
left.next = mergeTwoList(left.next, right);
}else {
res = right;
right.next = mergeTwoList(left, right.next);
}
return res;
}
}