题目
给你链表的头结点 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 };