题目描述:
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
示例 1:
输入: 4->2->1->3输出: 1->2->3->4
示例 2:
输入: -1->5->3->4->0输出: -1->0->3->4->5
算法实现:
/*** Definition for singly-linked list.* function ListNode(val) {* this.val = val;* this.next = null;* }*//*** @param {ListNode} head* @return {ListNode}*/var sortList = function(head) {if (head === null || head.next === null)return headlet slow = head,fast = headwhile (slow.next && fast.next && fast.next.next) {slow = slow.nextfast = fast.next.next}let mid = slow.nextslow.next = nulllet right = midlet left = headreturn merge(sortList(left), sortList(right))};let merge = function(left, right) {let res = new ListNode(null)let p1 = left,p2 = rightlet p = reswhile (p1 && p2) {if (p1.val < p2.val) {let s = p1p1 = p1.nexts.next = nullp.next = sp = s} else {let s = p2p2 = p2.nexts.next = nullp.next = sp = s}}if (p1)p.next = p1if (p2)p.next = p2return res.next}
思考:
看起来很简单实操却很难的一道题,由于控制了时间复杂度和空间复杂度,导致只能用归并排序的方法,以前并没有使用过这种方法,大致的思路是由底向上逐渐排序归并最后形成正确的链表。
总结:
很好的一道题,值得思考。
