开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第8天,点击查看活动详情
题目
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。
输入: head = [-1,5,3,4,0]
输出: [-1,0,3,4,5]
思路一
我们这里使用快慢指针结合递归进行实现,慢指针走一步,快指针走两步,这样的话快指针走到最后,慢指针正好走到一半,我们先判断一下head参数和head的next参数其中一项是否为空,如果是则为单节点或者空节点,直接将head参数返回出去即可,然后声明一个慢指针变量slow值为head,在声明一个快指针变量quick他的值为head的next参数,然后使用while进行循环,循环的条件为当前的quick参数不为null和qiuck的next参数不为null,只要满足条件则一直循环,在循环中我们将slow变量和quick变量重新赋值,将slow的值变为当前slow变量的next参数,quick值为quick的next.next参数,循环结束后声明一个mid变量,他是一个中间值,他的值是slow变量的next参数,然后我们再讲slow的next参数重新赋值为null,然后在声明left变量,他的值是我们使用当前sortList函数把当前的head参数传递进去进行左边递归排序,然后在声明一个right变量,我们同left变量只不过把递归的参数换成mid变量,然后我们声明一个node变量,模拟的指针节点,我们将里面的val值赋值为0,next参数赋值为null,然后在声明一个res变量,他的值为node,我们在使用while进行循环,循环条件为当前left和right变量都不为null的情况下就会循环,在循环中我们声明一个空字符串val变量,然后left变量的val参数和right变量的val参数进行比较大小,如果当前的left变量的大,则将val赋值为left,且将left的值重新赋值,如果left的next存在则赋值给left变量,否则就将null赋值给left变量,如果right变量大,如left变量一样进行赋值和对val变量的更改,最后将nede的next参数重新赋值为val变量,nede的变量重新赋值为node.next参数,实现nede节点下移操作,循环完成后进行判断当前left变量如果存在则将left赋值给node的next参数,如果right变量存在则将其赋值给node的next变量,最后将res.next返回出去
/**
* @param {ListNode} head
* @return {ListNode}
*/
var sortList = function(head) {
if (!head || !head.next) {
return head
}
let slow = head
let quick = head.next
while(quick != null && quick.next != null) {
slow = slow.next
quick = quick.next.next
}
let mid = slow.next
slow.next = null
let left = sortList(head)
let right = sortList(mid)
let node = {val: 0, next: null}
let res = node
while(left && right) {
let val = ''
if (left.val < right.val) {
val = left
left = left.next || null
} else {
val = right
right = right.next || null
}
node.next = val
node = node.next
}
if (left) {
node.next = left
}
if (right) {
node.next = right
}
return res.next
};