首页 > 其他分享 >Leetcode 148. 排序链表

Leetcode 148. 排序链表

时间:2024-11-12 20:16:06浏览次数:3  
标签:head right 148 next 链表 null Leetcode left

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

经典的分治算法应用,通过归并进行排序,需要用到一个与原数组相同长度的数组

归(分割)思想如上图所示,代码实现通过快慢指针来寻找链表的中点来分割指针

var spilitList = function(head) {
    if (head === null) {
        return null;
    }
    if (head.next === null) {
        return head;
    }

    let fast = head, slow = head;
    while (fast.next !== null && fast.next.next !== null) {
        slow = slow.next;
        fast = fast.next.next;
    }
    let mid = slow.next;
    slow.next = null; // 将链表分成两部分

    let left = spilitList(head); // 前半部分
    let right = spilitList(mid); // 后半部分

    return merge(left, right); // 合并排序后的两部分
}

 治(排序)设置左右指针指向分割之后的链表,设置一个指针来合并。

var merge=function(head1,head2){
    let newList=new ListNode(0)
    let dumy=newList,left=head1,right=head2
    while(left!==null&&right!==null){
        if(left.val>=right.val){
            dumy.next=right
            right=right.next
        }else{
            dumy.next=left
            left=left.next
        }
        dumy=dumy.next
    }
    //一边链表没走完
    if(left!=null){
        dumy.next=left
    }
    if(right!=null){
        dumy.next=right
    }
    return newList.next
}

标签:head,right,148,next,链表,null,Leetcode,left
From: https://blog.csdn.net/qq_61737534/article/details/143712002

相关文章

  • 山凉田带你玩转OJ--返回链表倒数第K个结点
    题目解读给定一个单链表和一个整数k,要求返回链表的倒数第k个节点。示例输入:1->2->3->4->5,k=2输出:4解题思路采用快慢指针法,具体步骤如下:初始化指针:快指针fast和慢指针slow都初始化为链表的头节点head。快指针提前走k步:让快指针fast先向前......
  • 山田凉带你玩转OJ--判断链表是否有环并返回环的起始结点
    技术博客:判断链表是否有环并返回环的起始结点引言在链表操作中,判断链表是否存在环形结构是一个常见的问题。本文将详细介绍如何使用快慢指针法判断链表是否有环,并进一步找到环的起始结点。我们将分步骤讲解每一步的实现原理,并提供完整的代码实现。1.题目解读题目要求:......
  • LeetCode 836[矩形重叠]
    题目链接LeetCode836[矩形重叠]详情实例提示题解思路无重叠的四种情况:第二个矩形的右边边如果在第一个矩形的左边边的左边或重叠第二个矩形的左边边如果在第一个矩形的右边边的右边或重叠第二个矩形的上边边如果在第一个矩形的下边边的下边或重叠第二个矩形的下......
  • leetcode 29. 两数相除
    29.两数相除一、使用long类型classSolution{public:longdivide2(longdividend,longdivisor){if(dividend<0&&divisor<0)returndivide2(-dividend,-divisor);elseif(dividend<0&&divisor>0)return-div......
  • leetcode 4. 寻找两个正序数组的中位数 困难 未完全解决
    leetcode4.寻找两个正序数组的中位数一、使用额外空间,类似归并排序的做法classSolution{public:doublefindMedianSortedArrays(vector<int>&nums1,vector<int>&nums2){intm=nums1.size();intn=nums2.size();inttemp[(m+n)/2+1];//......
  • OJ08题:876. 链表的中间结点
    目录题目思路分析代码展示题目给你单链表的头结点head,请你找出并返回链表的中间结点。注:如果有两个中间结点,则返回第二个中间结点。示例1:输入:head=[1,2,3,4,5]输出:[3,4,5]解释:链表只有一个中间结点,值为3。示例2:输入:head=[1,2,3,4,5,6]输出:[4,5......
  • 代码随想录算法训练营第十一天|LeetCode150.逆波兰表达式求值、239.滑动窗口最大值、3
    前言打卡代码随想录算法训练营第49期第十一天 φ(゜▽゜*)♪首先十分推荐学算法的同学可以先了解一下代码随想录,可以在B站卡哥B站账号、代码随想录官方网站代码随想录了解,卡哥清晰易懂的算法教学让我直接果断关注,也十分有缘和第49期的训练营大家庭一起进步。今日题目在学......
  • 代码随想录算法训练营第三天(LeetCode203.移除链表元素;LeetCode707.设计链表;LeetCode20
    LeetCode203.移除链表元素题目链接:LeetCode203.移除链表元素题目链接思路这道题目主要考察的是移除一个链表当中的元素,我们可以先在给定的链表前面加一个虚拟头结点,这样我们对给定链表头结点的操作和给定链表其余结点的操作就会变得相同。代码classSolution{p......
  • 代码随想录算法训练营第四天(LeetCode24.两两交换链表中的节点;LeetCode10.删除链表的倒
    LeetCode24.两两交换链表中的节点题目链接:两两交换链表中的节点题目链接思路这道题其实就是一个模拟题,要求每次交换链表中两个相邻的节点(1、2节点互换;3、4节点互换;2、3节点不互换,意思就是交换过的节点不参与后续的交换了),同时只能进行节点交换,不能进行值交换。主要考......
  • LeetCode【0011】盛最多水的容器
    本文目录1中文题目2求解思路2.1基础解法:暴力算法2.2优化解法:分治法2.3最优解法:双指针法3题目总结1中文题目给定一个长度为n的整数数组height。有n条垂线,第i条线的两个端点是(i,0)和(i,height[i])。找出其中的两条线,使得它们与x轴共同构成的......