leetcode-143-重排链表

2023-11-17

题意描述:

给定一个单链表 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]

参考:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

leetcode-143-重排链表 的相关文章

  • 【机器学习】LSTM 讲解

    2 LSTM 2 1 长期依赖问题 标准 RNN 结构在理论上完全可以实现将最初的信息保留到即使很远的时刻 但是在实践中发现 RNN 会受到短时记忆的影响 如果一条序列足够长 那它们将很难将信息从较早的时刻传送到后面的时刻 因此 如果正在尝
  • linux内核的构建系统,技术

    介绍 我不会告诉你怎么在自己的电脑上去构建 安装一个定制化的 Linux 内核 这样的资料太多了 它们会对你有帮助 本文会告诉你当你在内核源码路径里敲下make 时会发生什么 当我刚刚开始学习内核代码时 Makefile 是我打开的第一个文
  • pandas里面时间戳转时间to_datetime注意unit

    Using pandas to datetime with timestamps 遇到在pandas里面时间戳转时间的问题 把查到的答案记录在这里 主要注意to datetime函数里面的单位unit默认是毫秒ms 而非秒 而一般的10位时

随机推荐

  • [NAS]AutoML: A Survey of the State-of-the-Art

    AutoML A Survey of the State of the Art 自动机器学习 无需人类辅助自动进行机器学习 Abstract 本文根据AutoML的处理流程来对自动机器学习进行介绍 包括 数据准备 特征工程 超参数优化和神经
  • c++STL容器vector的复制

    将一个vector复制到另一个vector中 将一个vector v1 复制到另一个vector v2 中有两种方法 我知道的两种 囧 1 v2 v1 2 v2 assign v1 begin v1 end 两种方法的效果是一样的 vect
  • C++语言学习日志2.26

    初入C 跟C语言很多都很相似 主要从不同之处学习 1 I O流控制 流是一种抽象概念 他代表了数据的无结构化传递 按照流的方式进行输入输出 数据被当成无结构的字节序或字符序列 从流中取得数据的操作称为提取操作 而向流中添加数据的操作称为插入
  • 面试必问的MySQL锁与事务隔离级别

    之前多篇文章从mysql的底层结构分析 sql语句的分析器以及sql从优化底层分析 还有工作中常用的sql优化小知识点 面试各大互联网公司必问的mysql锁和事务隔离级别 这篇文章给你打神助攻 一飞冲天 锁定义 锁是计算机协调多个进程或线程
  • centos中apache使用教程

    一 安装Apache服务 1 检查是否安装了Apache服务器软件 rpm qa grep i httpd 2 查看apache2的命令 httpd V 3 停止和重启apache 其中HTTPD ROOT和SERVER CONFIG FI
  • 怎么成为一个软件架构师

    的确没想到随手写的东西有那么多的回复 不管怎样还是挺高兴的 在这里谢谢大家的关注了 其实做了这么多年的技术脑子里总会跳出很多的想法 但很少有时间静下来仔细地思考思考 写写博客也算是一种自我归纳和总结吧 软件架构师 这个名词也不知是什么时候进
  • 【三维重建学习之路01】点云ply文件的读写、修改

    文章目录 1 前言 2 PLY文件格式 3 读文件 变量 库 查看头文件 vertex信息 数据类型 读文件函数 按行阅读检查 4 写文件 参考 1 前言 关于使用python读写ply的比较清楚的教程很少 自己也是新手 摸索中 2 PLY
  • linux虚拟机重启后,运行nmtui提示NetworkManaer 未运行

    环境 centOS 8 虚拟机重启后 输入ifconfig 发现网卡丢失 1 重启NetworkManaer systemctl start NetworkManager 2 输入nmtui nmtui 编辑连接 笔者网络小白 只会用自动
  • 雅特力AT32F403A, 国产芯片PIN TO PIN 替代STM32F103

    中美贸易摩擦日渐加剧 美国从各个方面到处打压中国 半导体行业也收到一定冲击 逼迫国内企业不得不准备产品国产化方案 自从华为被美国制裁之后 国内的很多手机厂商明白了一个道理 爹有娘有 不如自己有 于是各大厂商纷纷走上了芯片国产化的道路 意法半
  • java Hashtable及其子类Properties 源码分析(通俗易懂)

    目录 一 前言 二 Hashtable详解 1 简介 2 特点 3 底层实现 4 HashMap VS Hashtable 三 Properties详解 1 简介 2 特点 3 具体使用 可以不看 四 完结撒 一 前言 大家好 本篇博文是对
  • 【已解决--2021报错】is not a supported wheel on this platform-解决安装simplejson失败的问题

    已解决 2021报错 is not a supported wheel on thisplatform 解决安装simplejson失败的问题 1 问题描述 直接在pycharm中pip安装simplejson失败 然后网上找了很多教程 但
  • 知网的爬取 很简单

    对于知网能爬出来的东西 首先说一下 论文的题目 时间 作者 摘要等信息 本文主要对搜索界面进行爬取 对于知网的爬虫可以说挺简单的 其难点在于有一个二次请求 通过断点分析youfiddler分析有两个要注意的url一个是红色的一个是橘色的 先
  • Javacv+Nginx实现rtsp转rtmp实现web端直播方式

    前言 前面的文章中使用websocket的方案在web端实现rtsp播放 因为各种原因 现需要重新写一套方案 不废话 上才艺 补充 项目中需求可能要同时观看多个摄像头 将本项目放开限制使用多个摄像头时 就会发现相机之间的切换加载时间及视频流
  • Android:实现一种浮动选择菜单的效果

    前几天更新了一下我手机上的百阅软件 上面的浮动对话框选择很好看 就模仿了一下 先看一下运行效果 主要原理是在dialog里扔进一个GridView 可以作为一个组件使用 源码如下 对话框使用的layout grid dialog xml
  • Lumen 5.2 中配置邮件

    本文转自 https laravel china org topics 1974 Lumen中的邮件配置好了之后还是很简单的 但是配置过程官方文档省略了太多 先来扒一扒遇到的坑 Class mailer does not exist 这个是
  • Mysql内置函数全解析——Mysql初级(三)

    一 前言 在关系型数据库使用的过程中 我们总会对DB里面的数据做各种不同形式的转换 字符串处理等基本操作 本文将会比较系统的学习总结Mysql中的各种内置函数 这是一个系列的文章 感兴趣的小伙伴可以关注一下哦 本文的行文思路是这样的 因为M
  • 微信小程序——获取绑定事件元素的ID

    小程序list数据带值跳转 一般直接通过设置item的id来标识或者通过设置键值data xxxx的方式标识 如下图所示 解析出来的结果如下图 我们看到它在元素上绑定了一个checkSchoolLogin事件 触发这个事件时需要获取该元素的
  • 关于单链表结构体定义结点时 LNode *LinkList的理解

    typedef struct LNode ElemType data 数据域 struct LNode next 指针域 LNode LinkList 先说结论 这个就可以直接理解为 第一个是便于定义变量的类型为LNode 如果没有使用ty
  • springboot配置来连接多个mysql数据库

    1 在yml里配置多数据库 spring datasource app1 jdbc url jdbc mysql localhost 3306 data1 useUnicode true characterEncoding UTF 8 se
  • leetcode-143-重排链表

    题意描述 给定一个单链表 L 的头节点 head 单链表 L 表示为 L0 L1 Ln 1 Ln 请将其重新排列后变为 L0 Ln L1 Ln 1 L2 Ln 2 不能只是单纯的改变节点内部的值 而是需要实际的进行节点交换 解题思路 Ali