当前位置: 首页 > news >正文

【leetcode热题100】反转链表 II

给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。

示例 1:

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

示例 2:

输入:head = [5], left = 1, right = 1
输出:[5]

提示:

  • 链表中节点数目为 n
  • 1 <= n <= 500
  • -500 <= Node.val <= 500
  • 1 <= left <= right <= n

解法一

首先找到 m 的位置,记录两端的节点 left1 和 left2 。

然后每遍历一个节点,就倒置一个节点。

到 n 的位置后,利用之前的 left1 和 left2 完成连接。

为了完成链表的倒置需要两个指针 pre 和 head。为了少考虑边界条件,例如 m = 1 的倒置。加一个哨兵节点 dummy。

m = 2, n = 41 2 3 4 5 加入哨兵节点 d,pre 简写 p,head 简写 h0 1 2 3 4 5 往后遍历
^ ^
d h
p0 1 2 3 4 5 此时 h 指向 m 的位置,记录 p 和 h 为 l1 和 l2
^ ^ ^
d p h0  1  2 3 4 5 然后继续遍历
^  ^  ^
d  p  hl1  l20  1  2  3 4 5 开始倒置链表,使得 h 指向 p
^  ^  ^  ^
d  l1 p  hl2

当前状态用图形描述

倒转链表,将 h 的 next 指向 p,并且后移 p 和 h。

然后上边一步会重复多次,直到 h 到达 n 的位置。当然这道题比较特殊,上图 h 已经到达了 n 的位置。

此时,我们需要将 h 指向 p,同时将 l1 指向 h,l2 指向 h.next,使得链表接起来。

操作完成,将 dummy.next 返回即可。

public ListNode reverseBetween(ListNode head, int m, int n) {if (m == n) {return head;}ListNode dummy = new ListNode(0);dummy.next = head;int count = 0;ListNode left1 = null;ListNode left2 = null;ListNode pre = dummy;while (head != null) {count++;//到达 m,保存 l1 和 l2if (count == m) {left1 = pre;left2 = head;}// m 和 n 之间,倒转链表if (count > m && count < n) {ListNode temp = head.next;head.next = pre;pre = head;head = temp;continue;}//到达 nif (count == n) {left2.next = head.next;head.next = pre;left1.next = head;break;}//两个指针后移head = head.next;pre = pre.next;}return dummy.next;
}

时间复杂度:O(n)。

空间复杂度:O(1)。

http://www.lryc.cn/news/298294.html

相关文章:

  • 谷歌 DeepMind 联合斯坦福推出了主从式遥操作双臂机器人系统增强版ALOHA 2
  • 金融行业专题|证券超融合架构转型与场景探索合集(2023版)
  • 【C语言】C的整理记录
  • 使用STM32Cubemx创建一个工程并且给出每一步的含义
  • C/C++模板初阶
  • linux系统下vscode portable版本的c++/Cmake环境搭建001
  • 【QT+QGIS跨平台编译】之三十一:【FreeXL+Qt跨平台编译】(一套代码、一套框架,跨平台编译)
  • 2024年 前端JavaScript入门到精通 第一天
  • 155基于matlab 的形态学权重自适应图像去噪
  • 操作系统——内存管理(附带Leetcode算法题LRU)
  • I/O多路复用简记
  • SPECCPU2017操作说明
  • openresty (nginx)快速开始
  • 相机图像质量研究(11)常见问题总结:光学结构对成像的影响--像差
  • 【深度学习】基于多层感知机的手写数字识别
  • 给定n,m(200),构造一个n*m的矩阵a,使得每个4*4的子矩阵,左上角2*2的子矩阵的异或和等于右下角的,左下角的异或和等于右上角的
  • 【开源】基于JAVA+Vue+SpringBoot的假日旅社管理系统
  • kafka 文件存储机制
  • 引入BertTokenizer出现OSError: Can‘t load tokenizer for ‘bert-base-uncased‘.
  • 陶陶摘苹果C++
  • STM32F1 引脚重映射功能
  • c语言的各类输出函数(带完善更新)
  • 【linux温故】CFS调度
  • 计算机网络之一
  • 从一到无穷大 #23 《流计算系统图解》书评
  • 华为问界M9:领跑未来智能交通的自动驾驶黑科技
  • Java图形化界面编程——弹球游戏 笔记
  • 浅谈人工智能之深度学习~
  • 【复现】大华 DSS SQL 注入漏洞_46
  • Python 中的断点类型详解