提供一个空间复杂度为O(1)的解法:插入排序。初始条件下,把链表的头节点摘下放在另外一个链表中,然后每次取未排序链表的头部,进行链表合并即可。时间复杂度和数组中的插入排序一致。
public class Solution {
public ListNode sortInList (ListNode head) {
if(head==null||head.next==null)return head;
ListNode res = head;
ListNode cur = head.next;
res.next = null;
while(cur!=null){
ListNode p = cur;
cur = cur.next;
p.next = null;
res = merge(res,p);
}
return res;
}
public ListNode merge(ListNode l1,ListNode l2){
if(l1==null)return l2;
if(l2==null)return l1;
if(l1.val<l2.val){
l1.next = merge(l1.next,l2);
return l1;
}
else {
l2.next = merge(l2.next,l1);
return l2;
}
}
}