前端算法-排序链表

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

题目

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


相关文章
|
1月前
|
算法
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
|
1月前
|
存储 算法
LeetCode第83题删除排序链表中的重复元素
文章介绍了LeetCode第83题"删除排序链表中的重复元素"的解法,使用双指针技术在原链表上原地删除重复元素,提供了一种时间和空间效率都较高的解决方案。
LeetCode第83题删除排序链表中的重复元素
|
1月前
|
搜索推荐 算法 Java
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
该博客文章通过UML类图和Java源码示例,展示了如何使用适配器模式将QuickSort类和BinarySearch类的排序和查找功能适配到DataOperation接口中,实现算法的解耦和复用。
16 1
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
|
27天前
|
算法 搜索推荐 Java
算法实战:手写归并排序,让复杂排序变简单!
归并排序是一种基于“分治法”的经典算法,通过递归分割和合并数组,实现O(n log n)的高效排序。本文将通过Java手写代码,详细讲解归并排序的原理及实现,帮助你快速掌握这一实用算法。
36 0
|
28天前
|
JavaScript 算法 前端开发
"揭秘Vue.js的高效渲染秘诀:深度解析Diff算法如何让前端开发快人一步"
【8月更文挑战第20天】Vue.js是一款备受欢迎的前端框架,以其声明式的响应式数据绑定和组件化开发著称。在Vue中,Diff算法是核心之一,它高效计算虚拟DOM更新时所需的最小实际DOM变更,确保界面快速准确更新。算法通过比较新旧虚拟DOM树的同层级节点,递归检查子节点,并利用`key`属性优化列表更新。虽然存在局限性,如难以处理跨层级节点移动,但Diff算法仍是Vue高效更新机制的关键,帮助开发者构建高性能Web应用。
38 1
|
1月前
|
算法
【算法】合并两个有序链表(easy)——递归算法
【算法】合并两个有序链表(easy)——递归算法
【算法】合并两个有序链表(easy)——递归算法
|
29天前
|
存储 算法
【初阶数据结构篇】顺序表和链表算法题
此题可以先找到中间节点,然后把后半部分逆置,最近前后两部分一一比对,如果节点的值全部相同,则即为回文。
|
1月前
|
算法
【数据结构与算法】共享双向链表
【数据结构与算法】共享双向链表
11 0
|
1月前
|
算法
【数据结构与算法】双向链表
【数据结构与算法】双向链表
10 0
|
1月前
|
算法
【数据结构与算法】循环链表
【数据结构与算法】循环链表
11 0

热门文章

最新文章