【题目】
Sort a linked list in O(n log n) time using constant space complexity.
【分析】
要求将一个单链表排序,时间复杂度为O(nlogn)
此题考查单链表的归并排序
1.找到单链表的中间节点,将整个单链表分为两个子链表
2.分别对两个子链表进行归并排序
3.将排好序的子链表合并成一个链表
【Java实现】
public class Solution {
public static ListNode getMiddleOfList(ListNode head) {
ListNode slow = head;
ListNode fast = head.next;
while(fast!=null&&fast.next!=null) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
public ListNode sortList(ListNode head) {
if(head==null || head.next==null) return head;
ListNode mid = getMiddleOfList(head);
ListNode next=mid.next;
mid.next=null;
ListNode l1 = sortList(head);
ListNode l2 = sortList(next);
return mergeList(l1,l2);
}
private static ListNode mergeList(ListNode a, ListNode b) {
ListNode helper = new ListNode(-1);
ListNode cur = helper;
while(a!=null && b!=null){
if(a.val<=b.val){
cur.next = a;
a= a.next;
}else{
cur.next = b;
b= b.next;
}
cur = cur.next;
}
if(a!=null){
cur.next = a;
}
if(b!=null) {
cur.next = b;
}
return helper.next;
}
}