要求时间复杂度O(nlogn),空间复杂度O(1),采用归并排序
传统的归并排序空间复杂度是O(n),原因是要用一个数组表示合并后的数组,但是这里用链表表示有序链表合并后的链表,由于链表空间复杂度是O(1),所以可以。
链表问题经常出现TLE问题或者MLE问题,这时候要检查链表拼接过程或者循环过程,看有没有死循环
public ListNode sortList(ListNode head) { if (head==null||head.next==null) return head; //利用快慢指针找到链表中点,并分成两部分递归 //要设置一个超前节点记录慢指针前一个节点作为前部分末尾 ListNode slow = head,fast = head,pre = null; while (fast!=null&&fast.next!=null) { pre = slow; slow = slow.next; fast = fast.next.next; } //前半部分 pre.next = null; ListNode l1 = sortList(head); ListNode l2 = sortList(slow); return merge(l1,l2); } public ListNode merge(ListNode l1,ListNode l2) { //设置超前节点 ListNode pre = new ListNode(0),temp = pre; while (l1!=null&&l2!=null) { if (l1.val<l2.val) { temp.next = l1; l1 = l1.next; } else { temp.next = l2; l2 = l2.next; } temp = temp.next; } if (l1!=null) temp.next = l1; if (l2!=null) temp.next = l2; return pre.next; }
归并排序请看:http://www.cnblogs.com/stAr-1/p/8445377.html