【LeetCode热题100(33/100)】排序链表
题目地址:链接
思路:
- 根据分治的思想,通过递归,使用双指针获取链表中点,不断将指针分裂,直到不能变小为止(
!head && !head.next
) - 不断将分裂的指针进行两两合并,最终合并成一个有有序的链表。
/*** Definition for singly-linked list.* function ListNode(val, next) {* this.val = (val===undefined ? 0 : val)* this.next = (next===undefined ? null : next)* }*/
/*** @param {ListNode} head* @return {ListNode}*/
let getMiddleNode = (head) => {let dummy = new ListNode(0, head);let [p, q] = [dummy, dummy];q = (q.next)?.next ?? null;while(q) {p = p.next;q = (q.next)?.next ?? null;}let ans = p.nextp.next = null;return ans;
}let mergeListNode = (h1, h2) => {let dummy = new ListNode(0);let p = dummy;while(h1 && h2) {if(h1.val < h2.val) {p.next = h1;h1 = h1.next;} else {p.next = h2;h2 = h2.next;}p = p.next;}p.next = h1 ?? h2;return dummy.next;
}
var sortList = function(head) {if(!head || !head.next) {return head;}let middleNode = getMiddleNode(head);let q = sortList(head);let p = sortList(middleNode);let ans = mergeListNode(q, p);return ans;
};