一、题目
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。
你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?
二、示例
输入:head = [4,2,1,3]
输出:[1,2,3,4]
输入:head = [-1,5,3,4,0]
输出:[-1,0,3,4,5]
输入:head = []
输出:[]
三、思路
本题的时间复杂度为O(nlogn)
,所以肯定是使用比较高级的一种排序方式。本题中我们应选择归并排序,此时如何找到中间的节点,然后开始切开呢?所以采用快慢指针来解决。
四、代码
/**
* 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) {
const rec = (node) => {
if(!node || !node.next) return node
let fast = node
let slow = node
let p = node
while(slow && fast && fast.next) {
fast = fast.next.next
p = slow
slow = slow.next
}
p.next = null
let leftNode = rec(node)
let rightNode = rec(slow)
let res = new ListNode(0)
let t = res
while(leftNode || rightNode) {
if(leftNode && rightNode) {
if(leftNode.val < rightNode.val) {
t.next = leftNode
leftNode = leftNode.next
}else {
t.next = rightNode
rightNode = rightNode.next
}
}else if(leftNode) {
t.next = leftNode
leftNode = leftNode.next
}else {
t.next = rightNode
rightNode = rightNode.next
}
t = t.next
}
return res.next
}
return rec(head)
};
五、总结
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_47450807/article/details/123461432
内容来源于网络,如有侵权,请联系作者删除!