给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。
示例 1:
输入:head = [4,2,1,3]
输出:[1,2,3,4]
示例 2:
输入:head = [-1,5,3,4,0]
输出:[-1,0,3,4,5]
示例 3:
输入:head = []
输出:[]
提示:
- 链表中节点的数目在范围 [0, 5 * 10^4] 内
- -10^5 <= Node.val <= 10^5
进阶:你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?
解题思路
1.首先将链表的全部节点切断,并放入数组中
2.然后对数组中的所有节点进行排序,最后拼接成链表,返回链表头节点即可
代码
/**
* 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}
*/
var sortList = function(head) {
if(!head) return null;
// 将链表的全部节点切断,并放入数组中
let s = [];
while (head) {
let temp = head.next;
head.next = null;
s.push(head);
head = temp;
}
// 对数组中的所有节点进行排序
s.sort((a, b) => (a.val - b.val));
// 拼接成链表
for(let i = 0; i < s.length - 1; i++) {
s[i].next = s[i + 1];
}
return s[0];
};