leetcode-143-重排链表

news2024/12/26 21:10:55

题意描述:

给定一个单链表 L 的头节点 head ,单链表 L 表示为:

L0 → L1 → … → Ln - 1 → Ln
请将其重新排列后变为:

L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。


解题思路:
Alice: 这题看起来有点简单啊。
Bob: 之间把每个链表节点的位置存到数组里面,然后双指针从两个方向去读,修改节点之间的指向关系就行了。
Alice: 需要注意的时候,末尾节点的 next 要改成 null
Bob: 这种方法能过的,就是要注意处理一下细节。
Alice: 我看到还有别的方法可以做的,搞得是什么双指针,中间节点,翻转链表合并链表那一套。
Bob: 中间节点 ?中间节点到这里倒是一定会变成末尾节点。如果是偶数个怎么办 ?偶数个没有中间节点的 ?
Alice: 那就是这时候是没有中间节点的,我好像明白了,双指针就是快慢双指针,且速度差是 1,这样一个到末尾的时候,一个刚好到中间。
Bob: 原来是这样,翻转链表和合并链表没啥好讲的了,属于是链表的基本操作了。
Alice: 有个问题,翻转链表的递归写法会爆栈吗 ?
Bob: 应该不会吧,只是修改指向关系而已。
Alice: 我去试试。递归翻转链表的内存使用率有点高啊,只超过了 6% 的人。
Bob: 还能改成循环 ??
Alice: 是啊,翻转链表还能改成循环。我想了好一会呢。

const revertLink = (headNode: ListNode) => {
        let prepre = null;
        let pre = headNode;
        let current = headNode.next
        while(current) {
            // 翻转
            pre.next = prepre;
            prepre = pre;
            pre = current;
            // 继续
            current = current.next;
        }
        pre.next = prepre;
        return pre;
    }

Bob: o( ̄▽ ̄)d good


代码:

typescript 存储链表节点

function reorderList(head: ListNode | null): void {
    const nodeListAddress = [];
    let temp = head;
    while(temp){
        nodeListAddress.push(temp);
        temp = temp.next;
    }
    let left = 0;
    let right = nodeListAddress.length - 1;

    let pre = null;
    while(left < right) {
        if(pre) {
            pre.next = nodeListAddress[left];
        }
        nodeListAddress[left].next = nodeListAddress[right];
        pre = nodeListAddress[right];
        left++;
        right--;
    }
    if(left === right && pre) {
        pre.next = nodeListAddress[left];
        pre = nodeListAddress[left];
        left++;
        right--;
    }
    // 尾节点
    if(pre) {
        pre.next = null;
    }
    
};

typescript 链表中点 + 翻转链表 + 合并链表


function reorderList(head: ListNode | null): void {

    // 边界条件
    if(!head.next) {
        return;
    }
    // 快慢指针找到中间节点
    const getMiddleNode = (headNode: ListNode) => {
        // 从 headNode 开始
        let fast = headNode;
        let slow = headNode;
        let preSlow = null;
        while(fast.next){
            fast = fast.next;
            if(fast.next) {
                fast = fast.next
            } 
            preSlow = slow;
            slow  = slow.next;

        }
        return preSlow;
    }

    const revertLink = (headNode: ListNode) => {
        // 递归终点
        if(headNode.next === null) {
            return headNode;
        } else {
            const ret = revertLink(headNode.next);
            headNode.next.next = headNode;
            return ret;
        }
    }

    const mergeLink = (left: ListNode, right: ListNode) => {
        let current = left;
        left = left.next;
        while(left || right) {
            if(right) {
                current.next = right;
                current = current.next;
                right = right.next;
            }
            if(left) {
                current.next = left;
                current = current.next;
                left = left.next;
            }
        }
    }



    const leftEnd = getMiddleNode(head);
    const rightStart = leftEnd.next;
    const right = revertLink(rightStart);
    // 斩断两个链表之间的联系
    leftEnd.next = null;
    rightStart.next = null;
    mergeLink(head, right);
};

测试用例:

[1000]

参考:

  • 题目链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/821004.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

cmake+pybind11打包c++库成python wheel安装包

目录 写在前面准备1、pybind11获取源码编译安装 2、conda demo官方源码修改CMakeLists.txt编译生成安装测试 参考完 写在前面 1、本文内容 有时候我们需要用c代码&#xff0c;供python调用&#xff0c;本文提供将c库封装成python接口的方法&#xff0c;并将库打包成可通过pip安…

Apikit 自学日记:API 异常监控-创建 API 监控

如何在apikit中&#xff0c;创建 API 监控呢&#xff1f; 创建并开启监控API 一、手动创建监控API Eolink API 网络监控平台支持从 Eolink API Management&#xff08;API管理产品&#xff09;中导入API信息&#xff0c;或者手动创建监控API。 进入API监控页面&#xff0c;点击…

23款奔驰S450 4MATIC升级原厂流星雨智能数字大灯,让智能照亮您前行的路

凭借智能数字大灯 (DIGITAL LIGHT)&#xff0c;您可体验根据其他道路使用者和周围环境进行优化调节的理想照明条件。这款包含130万像素模块大灯&#xff0c;进一步扩展了几何多光束 LED 大灯的功能。其高分辨率的照明可有针对性地点亮各个区域。解锁车辆时&#xff0c;大灯将通…

快速制作美容行业预约小程序

随着科技的不断进步&#xff0c;移动互联网的快速发展&#xff0c;小程序成为了很多行业迅速发展的利器。对于美容行业来说&#xff0c;一款美容预约小程序不仅可以方便用户进行预约&#xff0c;还可以提升美容店铺的服务质量和管理效率。下面&#xff0c;我们来介绍一下如何快…

23 设计模式(详细介绍附DEMO)

设计模式在Java中的应用与实现 &#x1f680;&#x1f680;&#x1f680;1.创建型模式1. 工厂方法模式&#xff08;Factory Pattern&#xff09;2.抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;3. 单例模式&#xff08;Singleton Pattern&#xff09;4.原型模…

rfid资产盘点管理系统软件

很多企业开始规划固定资产的总结&#xff0c;或者现在开始总结资产。面对众多不同种类的固定资产&#xff0c;总结已经成为一项工程量大、耗时长的任务。采用轻松的RFID固定资产管理系统后&#xff0c;可以大大提高这种总结工作的效率&#xff0c;获得比过去更清晰的资产清单和…

三菱plcCCLINK转profinet与西门子PLC通讯案例分析

用三菱PLC的控制系统需要和西门子的PLC控制系统交互数据&#xff0c;捷米JM-PN-CCLK 是自主研发的一款 PROFINET 从站功能的通讯网关。该产品主要功能是将各种 CCLINK 总线和 PROFINET 网络连接起来。 捷米JM-PN-CCLK总线中做为从站使用&#xff0c;连接到 CCLINK 总线中做为…

【C++】基于多设计模式下的同步异步日志系统

✍作者&#xff1a;阿润021 &#x1f4d6;专栏&#xff1a;C 文章目录 一、项目介绍二、项目实现准备工作1.日志系统技术实现策略2.相关技术知识补充2.1 不定参函数设计2.2 设计模式 三、日志项目框架设计1.模块划分2.各模块关系图 四、详细代码实现1.实用工具类设计2.日志等级…

StampedLock使用及源码分析:号称比读写锁还要快的锁

文章目录 一、StampedLock锁概述1、StampedLock锁简介2、ReentrantReadWriteLock回顾3、ReentrantReadWriteLock导致锁饥饿问题4、锁饥饿问题的缓解5、StampedLock与ReentrantReadWriteLock的对比6、StampedLock特点7、StampedLock的缺点 二、StampedLock的使用1、StampedLock的…

基于PHP校园疫情防控信息管理系统-计算机毕设 附源码12057

PHP校园疫情防控信息管理系统 摘 要 如今计算机行业的发展极为快速&#xff0c;搭载于计算机软件运行的数据库管理系统在各行各业得到了广泛的运用&#xff0c;其在数据管理方面具有的准确性和高效性为大中小企业的日常运营提供了巨大的帮助。自从2020年新冠疫情爆发以来&…

ArduPilot H743 Dual BMI270 Mark4 四轴DIY简单功能验证

ArduPilot H743 Dual BMI270 Mark4 四轴DIY简单功能验证 1. 源由2. 梳理2.1 基本配置2.2 滤波配置2.3 FPV-VTX配置2.4 FPV操控2.5 自适应PID调参2.6 电传配置 3. 视频3.1 FPV操控性3.2 路点巡航3.3 救援模式 4. 总结5. 参考资料6. 补充说明--问题集中回答 1. 源由 基于Mark4机…

易上手的数据报表工具有哪些?奥威BI零编程

易上手的数据报表功能有哪些&#xff1f;实际上&#xff0c;国产的BI报表工具都算得上是易上手的&#xff0c;因为它们大多都是低代码的BI报表工具&#xff0c;只需掌握基础SQL即可。但奥威BI报表工具却是零编程做大数据分析的BI报表工具。要说易上手&#xff0c;奥威BI报表工具…

Spark-统一内存模型

总结&#xff1a; Spark的内存模型分为4部分&#xff0c;分别是存储内存&#xff0c;计算内存&#xff0c;其他内存&#xff0c;预留内存&#xff1b; 其中存储内存和计算内存可以动态占用&#xff0c;当己方内存不足对方空余则可占用对方的内存&#xff0c;计算内存被存储内…

Attention机制竟有bug,Softmax是罪魁祸首,影响所有Transformer

大模型开发者&#xff0c;你们错了&#xff01; 「我发现注意力公式里有个 bug&#xff0c;八年了都没有人发现。所有 Transformer 模型包括 GPT、LLaMA 都受到了影响。」 昨天&#xff0c;一位名叫 Evan Miller 的统计工程师的话在 AI 领域掀起了轩然大波。 我们知道&#x…

解决单节点es索引yellow

现象 单节点的es&#xff0c;自动创建索引后&#xff0c;默认副本个数为1&#xff0c;索引状态为yellow 临时解决 修改副本个数为0 永久解决 方法1、修改elasticsearch.yml文件&#xff0c;添加配置并重启es number_of_replicas&#xff1a;副本分片数&#xff0c;默认…

UG\NX二次开发 创建分割面、细分面

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: 群友问“UF没有分割面吗” 这个是有的,下面就是分割面(细分面)的演示效果和c++源代码。 效果: 代码: #include "me.hpp" #include <stdio.h> #include <string.h> #i…

财报解读:英特尔二季度业绩回暖,IFS业务增长势能已然释放?

英特尔终于看到了盈利曙光。 北京时间7月28日&#xff0c;英特尔公布了2023财年第二季度财报&#xff0c;数据显示公司业绩超出市场预期&#xff0c;财报一经发布&#xff0c;第二个交易日英特尔股价上涨6.6%&#xff0c;最终报收36.83美元。 &#xff08;图片来源&#xff1a…

挪威网络安全大危机?数据备份刻不容缓

挪威国家安全局近期确认&#xff0c;黑客利用Ivanti Endpoint Manager Mobile&#xff08;EPMM&#xff09;解决方案中的零日漏洞对多个软件平台进行攻击&#xff0c;访问并窃取了受感染系统中的敏感数据&#xff0c;导致出现数据泄露问题。 此次零日漏洞&#xff08;CVE-2023-…

CentOS7环境安装tomcat

环境准备 由于是在练习&#xff0c;为了方便&#xff0c;我们可以 1.关闭防火墙 systemctl disable firewalld.service systemctl stop firewalld.service 2.关闭selinux 在/etc/selinux/config中&#xff0c;设置&#xff1a; SELINUXdisabled 3.准备jdk---》jdk-8u333-li…

通过电商项目,详解抓包到接口测试,附验证码 +cookie 问题处理!

一、背景 通常来说&#xff0c;进行接口测试&#xff0c;开发会提供对应的接口文档给到测试&#xff0c;但也有例外。开发无接口文档&#xff0c;但领导又需要你对刚开发的软件&#xff0c;进行接口测试、接口自动化测试、甚至是性能测试。这个时候作为专业测试应该怎么办&…