在 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
按照要求需要二分法
对于链表使用二分法 使用快慢指针找到中点
class Solution {
static ListNode merge(ListNode l1,ListNode l2)
{ ListNode prehead = new ListNode(-1);
ListNode prev = prehead;
while (l1 != null && l2 != null) {
if (l1.val <= l2.val) {
prev.next = l1;
l1 = l1.next;
} else {
prev.next = l2;
l2 = l2.next;
}
prev = prev.next;
}
prev.next = l1 == null ? l2 : l1;
return prehead.next;
}
public ListNode sortList(ListNode head) {
if(head==null||head.next==null)
return head;
ListNode slow=head;
ListNode fast=head.next;
while(fast!=null&&fast.next!=null)
{
fast=fast.next.next;
slow=slow.next;
}
ListNode temp=slow.next;
slow.next=null;
ListNode l1=sortList(head);
ListNode l2=sortList(temp);
return merge(l1,l2);
}
}