前端算法-排序链表

简介: 前端算法-排序链表

题目

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


相关文章
|
22天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
22天前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
1月前
|
存储 缓存 算法
经典算法之链表篇(三)
经典算法之链表篇(三)
|
1月前
|
算法
经典算法之链表篇(二)
经典算法之链表篇(二)
|
1月前
|
算法 索引
经典算法之链表篇
经典算法之链表篇
|
1月前
|
移动开发 算法 前端开发
前端常用算法全解:特征梳理、复杂度比较、分类解读与示例展示
前端常用算法全解:特征梳理、复杂度比较、分类解读与示例展示
22 0
|
1月前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
49 0
|
1月前
|
算法
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
31 0
|
1月前
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
133 2
|
1月前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
43 0
下一篇
无影云桌面