Leetcode 剑指 Offer II 026. 重排链表

news2025/2/28 6:23:22

题目难度: 中等

原题链接

今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~

题目描述

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

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

L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → …

不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例 1:

  • 输入: head = [1,2,3,4]
  • 输出: [1,4,2,3]

示例 2:

  • 输入: head = [1,2,3,4,5]
  • 输出: [1,5,2,4,3]

提示:

  • 链表的长度范围为 [1, 5 * 10^4]
  • 1 <= node.val <= 1000

题目思考

  1. 如何做到 O(1) 空间复杂度?

解决方案

思路

  • 分析题目, 最容易想到的做法就是把链表节点用数组存储, 然后使用头尾双指针交替指向对方
  • 不过这种做法的空间复杂度是 O(N), 如何优化呢?
  • 注意题目重排的方式是 1->N, 2->N-1, 以此类推, 相当于左半部分和翻转的右半部分进行合并
  • 所以我们可以分为以下三步实现:
  1. 将链表分为左右两半部分, 并断开之间的连接, 这里可以通过快慢指针的方式找到中点:
    1. 快指针每次移动两步, 慢指针每次移动一步
    2. 这样快指针变成空的时候, 慢指针就到了中点, 即左半部分末尾
    3. 慢指针的下个节点就是右半部分开头, 保存它, 并断开慢指针和它的连接
  2. 然后对右半部分进行翻转, 这里可以使用双指针做到, 具体可以参考之前的文章: [024 TODO]
  3. 最后再将两部分交替合并即可, 这里同样使用双指针来进行合并:
    1. 保存左右指针的下个节点
    2. 左指针指向右指针
    3. 右指针指向左指针下个节点
    4. 左右指针移动到先前保存的各自下个节点的位置
  • 下面代码有详细的注释, 方便大家理解

复杂度

  • 时间复杂度 O(N): 每步操作都只需要遍历每个节点一次
  • 空间复杂度 O(1): 只使用了几个常数空间的变量

代码

class Solution:
    def reorderList(self, head: ListNode) -> None:
        """
        Do not return anything, modify head in-place instead.
        """
        # 快慢指针找中点+右半部分翻转+链表合并
        if not head:
            return None
        # 第一步: 快慢指针找中点
        # 注意长度是偶数的话中点使用左半部分最后一个节点
        fast = head.next
        slow = head
        while fast and fast.next:
            slow = slow.next
            fast = fast.next.next
        # 第二步: 右半部分翻转
        # 此时slow是左半部分的尾节点
        # 先断开左右部分的连接
        cur = slow.next
        slow.next = None
        # 然后进行经典链表翻转
        pre = None
        while cur:
            nex = cur.next
            cur.next = pre
            pre, cur = cur, nex
        # 第三步: 链表合并
        # 此时pre是右半部分翻转后的头节点
        # 使用双指针依次指向对方下一个节点即可
        l, r = head, pre
        while l and r:
            nl = l.next
            nr = r.next
            l.next = r
            r.next = nl
            l = nl
            r = nr
        return head

大家可以在下面这些地方找到我~😊

我的 GitHub

我的 Leetcode

我的 CSDN

我的知乎专栏

我的头条号

我的牛客网博客

我的公众号: 算法精选, 欢迎大家扫码关注~😊

算法精选 - 微信扫一扫关注我

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

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

相关文章

day32_HTML

今日内容 零、 复习昨日 一、二阶段介绍 二、HTML 零、 复习昨日 晨考 一、二阶段介绍 第一阶段: JavaSE, 对java基本语法,面向对象知识,和编程有了基本了解 第二阶段: javaweb阶段 开发入门 前端 网页(用户直接交互界面)html 网页css 美化js 动起来 - jquerybootstrap 服务器 …

C++三部曲|C++内存管理全景指南

导语 深入理解C内存管理&#xff0c;一文了解所有C内存问题&#xff0c;万字长文&#xff0c;建议收藏 随着人工智能&#xff0c;云计算等技术的迅猛发展&#xff0c;让Python&#xff0c;go等新兴语言流行了起来&#xff0c;很多人以为C可能已经过时了&#xff0c;确实&…

《vector的模拟实现》

本文主要介绍vector的常见接口的模拟实现 文章目录 vector中常用类成员二、vector的底层结构三、vector的默认成员函数构造函数1—空构造构造函数2—迭代器区间构造拷贝构造函数赋值运算符重载析构函数 四、迭代器相关的函数迭代器的分类迭代器对应的STL容器分类迭代器失效问题…

软件系统架构对测试的影响分析

我们知道软件系统的架构会对系统测试产生影响&#xff0c;而到底会产生哪些影响呢?   首先看一下软件系统架构到底是如何定义的?   软件系统架构就是组成系统的主要重要模块、过程、数据的管理和分配、用户界面的种类和风格&#xff0c;以及系统运行平台等。其中包括它们…

在MacBook上编译v3s内核出错

刚开始的时候&#xff0c;我捣鼓esp8266「现在我也还有8266的开发板&#xff0c;后面也还是会推荐」 后面&#xff0c;我推荐了esp32&#xff0c;买了esp32开发板&#xff0c;可以做uac相关的实验&#xff0c;也可以搞图形界面了。 现在&#xff0c;终于到捣鼓Linux了 PS&#…

完整的医学影像PACS系统全套源码(带三维重建)

一套完整的医学影像存储与传输系统源码&#xff0c;PACS部分主要提供医学影像获取、影像信息网络传递、大容量数据存储、影像显示和处理、影像打印等功能。 RIS主要提供分诊登记、叫号、检查报告生成和打印等功能。本套影像存储与传输系统将二者进行无缝对接&#xff0c;提供了…

Navicat Premium 15安装注教程

Navicat Premium 15安装 准备工作 下载好安装包navicat150_premium_cs_x64和安装完成Navicat Premium 15 链接&#xff1a;https://pan.baidu.com/s/1TJs3pjAXJXhu7-13DJLzpg 提取码&#xff1a;hunk 安装Navicat Premium 15 无脑操作&#xff0c;下一步下一步就行了&…

【利用AI让知识体系化】万字深入浅出Nginx

思维导图 文章目录 思维导图 第一部分&#xff1a;入门篇1.1 起步下载和安装Nginx启动NginxNginx配置文件Nginx命令行总结 1.2 Nginx的基本架构1.3 安装和配置Nginx1.4 Nginx的基本操作 第二部分&#xff1a;核心篇2.1 Nginx的请求处理2.2 Nginx的缓存机制2.3 Nginx的负载均衡机…

二叉树基础

https://www.bilibili.com/video/BV1Hy4y1t7ij/?spm_id_from333.337.search-card.all.click&vd_source168d5f618ec1a68e1f162d91a35a12b6 完全二叉树的底部一定是从左到右是连续的。满二叉树一定是完全二叉树。 二叉搜索树&#xff1a;左边左子树的所有节点都小于这个中间…

【ROS】如何让ROS中节点获取数据 III --参数服务器通信及ros常用工具指令介绍

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法…感兴趣就关注我吧&#xff01;你定不会失望。 参数服务器通信及ros常用工具指令介绍 0.参数服务器概念1.参数服务器增加/修改参数&#xff1a;2.参数服务器查找参数3.参数服务器删除参…

大家都是拷贝,凭什么你这么秀?

入门教程、案例源码、学习资料、读者群 请访问&#xff1a; python666.cn 大家好&#xff0c;欢迎来到 Crossin的编程教室 &#xff01; 之前关于 Python 的作用域、赋值、参数传递&#xff0c;我们接连谈了几篇文章&#xff1a; Python常见问题&#xff1a;全局变量和局部变量…

Marking

Marking 题目描述 输入输出 #include<iostream> #include<algorithm> using namespace std; typedef long long ll; ll gcd(ll a,ll b) {return b0?a:gcd(b,a%b); } int main() {ll t;cin>>t;ll n,d,k;while(t--){cin>>n>>d>>k;k--;if(g…

数据结构学习分享之树的介绍

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:数据结构学习分享⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你了解更多数据结构的知识   &#x1f51d;&#x1f51d; 数据结构第六课 1. 前言&a…

5.13下周黄金最新行情走势分析及多空交易策略

近期有哪些消息面影响黄金走势&#xff1f;下周黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;周五(5月12日)美市尾盘&#xff0c;现货黄金收报2010.23美元/盎司&#xff0c;下跌4.57美元或0.23%&#xff0c;日内最高触及2022.59美元/盎司&#xff0c;最低触及…

IDEA 2022.3版本安装

安装前的准备 (免费使用方式私信我&#xff01;&#xff01;) • 64 位 Microsoft Windows 11、10、8 • 最低 2 GB 可用 RAM&#xff0c;推荐 8 GB 系统总 RAM • 2.5 GB 硬盘空间&#xff0c;推荐 SSD • 最低屏幕分辨率 1024x768 从安装上来看&#xff0c;IntelliJ IDEA 对硬…

asp.net+C#-高校社团管理网站

1、前台&#xff08;主要提供给学生使用&#xff09;&#xff1a;&#xff08;1&#xff09;注册&#xff0c;学生可以注册&#xff08;2&#xff09;登录&#xff0c;用户可以登录系统&#xff08;3&#xff09;查看社团活动&#xff0c;可以在页面查看社团的详细活动内容&…

Python基础入门编程代码练习(七)

一、读取json文件 创建一个json格式的文件,包含以下信息&#xff08;注意&#xff0c;地址是一个json对象&#xff0c;包含国家和城市&#xff09;&#xff0c;请使用Python中读取json文件的方法获取并打印json对象中的姓名、年龄以及城市信息 我叫小明,我今年 18 岁,性别男,…

如何批量查询自己的CSDN博客质量分

批量查询自己的CSDN博客质量分 一&#xff1a;故事背景二&#xff1a;具体实现2.1 csdn 接口分析2.2 apiPost调用接口2.2 RestTemplate进行接口调用2.2.1 需要引入的Maven依赖2.2.2 调用2.2.2 两个接口2.2.3 导出Excel到自己的电脑2.2.4 效果 三&#xff1a;总结提升 一&#x…

POWERLINK协议源码(最新)在stm32单片机上的移植指南

最近着了powerlink的道&#xff0c;连续几晚十二点前没睡过觉。不得不说兴趣这东西劲太大了&#xff0c;让人睡不着。喜欢上研究POWERLINK&#xff0c;最新版的源码结构挺清晰的&#xff0c;移植并测试了嵌入式linux作为从站和电脑主站之间的通信&#xff0c;挺有趣的。接下来想…

idea注释配置

走过路过不要错过&#xff01; 如果你也想要这样的注释模板&#xff0c;前接着往下看&#xff01; 注释模板有两种方式 1、新建类的时候自动添加注释 按照上图中的提示&#xff0c;找到settings中的File Code Templates选择右边Files选项卡中&#xff0c;选择class在右侧输入…