LeetCode 解题思路 16(Hot 100)

embedded/2025/3/15 6:28:29/

在这里插入图片描述

解题思路:

  1. 初始化辅助节点:
  • dummy:哑节点。
  • pre:当前链表的前一个节点。
  • start:当前链表的第一个节点。
  • end:当前链表的最后一个节点。
  • nextStart:end.next,下组链表的第一个节点,用于连接当前链表尾部。
  1. 翻转当前的链表:
  • 断开当前链表与剩余链表组,end.next = null。
  • 通过 start 翻转链表并得到翻转后的头节点 newHead = reverse(start)。
  1. 连接翻转后链表:
  • 头部:pre.next = newHead;
  • 尾部:start.next = nextStart;
  1. 更新状态: pre = start。

Java代码:

class Solution {public ListNode reverseKGroup(ListNode head, int k) {if (head.next == null || k == 1) return head;ListNode dummy = new ListNode(-1);dummy.next = head;ListNode pre = dummy;while (true) {ListNode start = pre.next;ListNode end = pre;for(int i = 0; i < k && end != null; i++){end = end.next;}if (end == null) break;ListNode nextStart = end.next;end.next = null;ListNode newHead = reverse(start);pre.next = newHead;start.next = nextStart;pre = start;}return dummy.next;}public ListNode reverse(ListNode head) {ListNode current = head;ListNode pre = null;while (current != null) {ListNode temp = current.next;current.next = pre;pre = current;current = temp; }return pre;}
}

复杂度分析:

  • 时间复杂度: O(n)。
  • 空间复杂度: O(1),无额外空间占用。

在这里插入图片描述

解题思路:

  1. 第一次遍历: 创建复制节点并建立映射。
  2. 第二次遍历: 设置next和random指针。

Java代码:

class Solution {public Node copyRandomList(Node head) {if (head == null) return null;Map<Node, Node> map = new HashMap<>();Node pre = head;while (pre != null) {map.put(pre, new Node(pre.val));pre = pre.next;}pre = head;while (pre != null) {Node copy = map.get(pre);copy.next = map.get(pre.next);copy.random = map.get(pre.random);pre = pre.next;}return map.get(head);}
}

复杂度分析:

  • 时间复杂度: O(n),需要两次遍历链表,每次遍历时间为 O(n),总时间为 O(2n) = O(n)。
  • 空间复杂度: ​O(n),哈希表存储所有原节点到复制节点的映射,占用 O(n) 空间。

http://www.ppmy.cn/embedded/172687.html

相关文章

HashMap的奇幻漂流:当一个数组决定去整容

标准答案&#xff08;面试官最爱版&#xff09; HashMap实现原理&#xff1a; 数据结构&#xff1a;数组链表/红黑树&#xff08;Java 8&#xff09;哈希算法&#xff1a;(h key.hashCode()) ^ (h >>> 16)索引计算&#xff1a;(n-1) & hash&#xff08;n为数组…

YOLOv8模型改进 第三十二讲 添加Transformer Self Attention TSA 解决CNN过程中特征丢失的问题

在医学图像分割过程中&#xff0c;卷积操作的局部性导致全局信息缺失&#xff0c;连续下采样导致细节丢失&#xff0c;以及跳跃连接未能有效融合多尺度特征。TSA通过自注意力机制捕捉全局上下文&#xff0c;结合位置编码保留空间信息&#xff0c;同时多头机制增强特征表达能力。…

[RA-L 2023] Coco-LIC:基于非均匀 B 样条的连续时间紧密耦合 LiDAR-惯性-相机里程计

这段代码是一个基于 C 的均匀 B 样条&#xff08;Uniform B-spline&#xff09;实现&#xff0c;专门用于表示 SE(3) 变换&#xff08;即三维空间中的刚体变换&#xff0c;包括旋转和平移&#xff09;。以下是对代码的总结&#xff1a; 1. 许可证和版权 使用 BSD 3-Clause Li…

养生,点亮健康生活

在当今快节奏的社会&#xff0c;人们常常在忙碌奔波中&#xff0c;忽略了健康才是生活的根本。养生&#xff0c;并非是老年人的专属&#xff0c;而是关乎每一个渴望生活品质、追求健康体魄之人的终身课题。它就像一位无声的守护者&#xff0c;默默改善着我们的身体机能&#xf…

【Javascript网页设计】个人简历网页案例

代码如下: <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>个人简历 - 张三…

爬虫案例八js逆向爬取网易音乐

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、js逆向的前期准备二、网站分析三、代码 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 爬取网易音乐 提示&#xff1a;以下是本篇…

【C++指南】string(二):深入探究 C++ `basic_string`:成员变量、函数全解析

. &#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《C指南》 期待您的关注 文章目录 引言basic_string 的成员变量内部结构概述示例代码推测成员变量 默认成员函数构造函数析构函…

maven--依赖的搜索顺序

原文网址&#xff1a;maven--依赖的搜索顺序-CSDN博客 简介 本文介绍maven中依赖的搜索顺序。 依赖搜索顺序 maven项目使用的仓库的方式 中央仓库。 这是默认的仓库。对应url为&#xff1a;http://repo1.maven.org/maven2/镜像仓库。 通过 settings…