JS算法-链表排序

简介: JS算法-链表排序

题目


给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表

输入: head = [4,2,1,3]
输出: [1,2,3,4]


题解


我们首先在sortList函数中先定义一个虚拟节点dummy,将其next指向头节点head,方便操作链表,在使用getLength函数获取链表长度len,然后使用步长step进行循环排序,每次将链表分成长度为step的两个子链表,然后将这两个子链表合并成一个有序链表,最后将所有的有序子链表合并成一个有序链表,在定义pre和cur两个指针,这两个指针分别指向虚拟节点dummy和头节点head,然后循环链表,将链表分成长度为step的两个子链表,接下来使用split函数将链表分成长度为step的两个子链表h1和h2,在使用split函数将链表再次分成长度为step的两个子链表,cur指针指向第二个子链表的头节点,最后使用merge函数将两个子链表h1和h2合并成一个有序链表,pre.next指向合并后的链表,使用循环将链表排序完成,最后返回虚拟节点dummy的next节点即为排序后的链表,上述的操作时将链表进行递归分成两个子链表,分别对子链表进行排序,然后将两个有序子链表合并成一个有序链表进行返回了出来

var sortList = function (head) {
  const dummy = new ListNode(-1)
  const len = getLength(head)
  dummy.next = head;
  for (let step = 1; step < len; step = step * 2) {
    let pre = dummy, cur = dummy.next
    while (cur) {
      let h1 = cur
      let h2 = split(h1, step)
      cur = split(h2, step)
      pre.next = merge(h1, h2)
      while (pre.next) {
        pre = pre.next
      }
    }
  }
  return dummy.next
  function getLength(head) {
    let i = 0
    while (head) {
      i++
      head = head.next
    }
    return i
  }
  function merge(l1, l2) {
    let head = new ListNode(-1), pre = head
    while (l1 && l2) {
      if (l1.val < l2.val) {
        pre.next = l1
        l1 = l1.next
      } else {
        pre.next = l2
        l2 = l2.next
      }
      pre = pre.next
    }
    pre.next = l1 ? l1 : l2
    return head.next
  }
  function split(head, step) {
    if (head == null) return null
    let pre = head, next = null
    for (let i = 1; i < step && pre.next; i++) {
      pre = pre.next
    }
    next = pre.next
    pre.next = null
    return next
  }
};
相关文章
|
27天前
|
算法
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
58 1
|
27天前
|
算法 索引
❤️算法笔记❤️-(每日一刷-141、环形链表)
❤️算法笔记❤️-(每日一刷-141、环形链表)
42 0
|
27天前
|
算法
【❤️算法笔记❤️】-(每日一刷-876、单链表的中点)
【❤️算法笔记❤️】-(每日一刷-876、单链表的中点)
41 0
|
27天前
|
算法
【❤️算法笔记❤️】-每日一刷-23、合并 K 个升序链表
【❤️算法笔记❤️】-每日一刷-23、合并 K 个升序链表
30 0
|
27天前
|
存储 算法
【❤️算法笔记❤️】-每日一刷-21、合并两个有序链表
【❤️算法笔记❤️】-每日一刷-21、合并两个有序链表
80 0
|
8天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
8天前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
2月前
|
算法 JavaScript 前端开发
第一个算法项目 | JS实现并查集迷宫算法Demo学习
本文是关于使用JavaScript实现并查集迷宫算法的中国象棋demo的学习记录,包括项目运行方法、知识点梳理、代码赏析以及相关CSS样式表文件的介绍。
第一个算法项目 | JS实现并查集迷宫算法Demo学习
|
26天前
|
存储 缓存 算法
经典算法之链表篇(三)
经典算法之链表篇(三)
|
26天前
|
算法
经典算法之链表篇(二)
经典算法之链表篇(二)