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

链表面试必刷双题解 | 随机链表复制 + 排序链表 高频真题全解析

目录

138. 随机链表的复制

题目链接

题目简介

解题思路

满分代码(极简注释版)

148. 排序链表

题目链接

题目简介

解题思路

满分代码(规范命名 + 超强注释)


138. 随机链表的复制

题目链接

138. 随机链表的复制 - 力扣(LeetCode)

题目简介

给你一个长度为n的随机链表,每个节点包含一个额外的随机指针,该指针可以指向链表中的任何节点或空节点。要求返回这个链表的深拷贝

解题思路

普通链表复制只需处理next指针,而本题难点在于随机指针random的指向无法一次性确定。我们用哈希表完美解决,核心分两步遍历,逻辑简单无坑:

  1. 第一遍遍历:不处理指针关系,仅克隆所有节点,用HashMap存储原节点 → 新节点的映射关系;
  2. 第二遍遍历:根据哈希表,直接为新节点赋值nextrandom指针,一步到位。

满分代码(极简注释版)

java

运行

/* // Definition for a Node. class Node { int val; Node next; Node random; public Node(int val) { this.val = val; this.next = null; this.random = null; } } */ class Solution { public Node copyRandomList(Node head) { // 边界判断:空链表直接返回 if(head == null){ return null; } // 哈希表:key = 原节点,value = 克隆的新节点 Map<Node,Node> map = new HashMap<>(); Node cur = head; // 第一步:遍历链表,克隆所有节点,建立映射关系 while(cur != null){ map.put(cur, new Node(cur.val)); cur = cur.next; } // 第二步:再次遍历,为新节点设置 next 和 random 指针 cur = head; while(cur != null){ // 复制 next 指针 if(cur.next != null){ map.get(cur).next = map.get(cur.next); } // 复制 random 指针 if(cur.random != null){ map.get(cur).random = map.get(cur.random); } cur = cur.next; } // 返回克隆链表的头节点 return map.get(head); } }

148. 排序链表

题目链接

148. 排序链表 - 力扣(LeetCode)

题目简介

给你链表的头结点head,请将其按升序排列并返回排序后的链表,要求时间复杂度 O(nlogn)。

解题思路

链表排序最优解:归并排序(递归版)链表不支持随机访问,快排 / 堆排都不适用,而归并排序天然适配链表结构,核心分两大步骤:

  1. 分割链表:快慢指针找中点,将链表从中间切断,递归分割至每个子链表只有 1 个节点(天然有序);
  2. 合并有序链表:双指针合并两个有序子链表,最终得到完整有序链表。

满分代码(规范命名 + 超强注释)

java

运行

/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */ class Solution { public ListNode sortList(ListNode head) { // 递归终止条件:空节点 或 单个节点,无需排序 if(head == null || head.next == null){ return head; } // 快慢指针:寻找链表中点(偶数节点找左中点) ListNode fast = head, slow = head; while(fast.next != null && fast.next.next != null){ slow = slow.next; fast = fast.next.next; } // 从中点切断链表,分割为左右两个子链表 ListNode mid = slow.next; slow.next = null; // 递归排序左右子链表 ListNode left = sortList(head); ListNode right = sortList(mid); // 合并两个有序链表(虚拟头节点简化操作) ListNode dummy = new ListNode(Integer.MIN_VALUE); ListNode cur = dummy; while(left != null && right != null){ if(left.val < right.val){ cur.next = left; left = left.next; }else{ cur.next = right; right = right.next; } cur = cur.next; } // 拼接剩余未遍历完的节点 cur.next = left != null ? left : right; // 返回排序后的链表头 return dummy.next; } }
http://www.jsqmd.com/news/552386/

相关文章:

  • NodeJS报错解决:OnlyOffice8.2禁用JWT后如何允许私有IP下载文件
  • 告别RTMP高延迟:手把手教你用WebRTC + DJI SDK打造低延时无人机直播(Android实战)
  • 告别手动画封装!用立创商城+AD一键导入原理图与PCB库(附3D模型关联技巧)
  • 【菜鸟飞】Conda环境管理与vscode无缝协作实战指南
  • 【Python实战】PyArrow高效读写Parquet:从基础操作到大数据批处理
  • 用GPT-4o和MM-Agent,15分钟搞定数学建模竞赛题?手把手教你复现这个开源框架
  • Masaylo机器人控制库:Arduino嵌入式运动控制与传感器融合详解
  • 南北阁Nanbeige 4.1-3B实现数据库课程设计自动化
  • eNSP校园网项目复盘:老师指出的子网划分、设备备份等5个常见误区与优化方案
  • 国行Mac用户必看:Xcode 26 AI助手完整配置指南(含DeepSeek接入教程)
  • RT-DETR:以Transformer架构重塑实时目标检测的精度与速度边界
  • 哔哩下载姬(downkyi)技术解析与应用指南:从基础操作到高级优化
  • 智能家居联动:OpenClaw+GLM-4.7-Flash语音控制IoT设备
  • Java毕业设计基于springboot+vue的校园电动车租赁系统
  • 非线性奇异谱分解算法:精细化处理时间序列数据,提取CSV文件信号特征,生成希尔伯特谱分析报告
  • 别再只用==了!MATLAB数据比较全攻略:从isequal到setdiff的7个实用函数详解
  • 5G NR Rel16测量上报事件深度解析:从A1到I1的触发机制与应用场景
  • 手把手教你用Python Z3求解器搞定CTF逆向中的线性方程组(附NewStarCTF2025实战)
  • 【PyCon全球技术委员会推荐】:Python内存效率提升300%的6项工业级策略——含生产环境OOM根因分析报告(2024最新版)
  • 面试官是算法出身,感觉没有问的很难?揭秘AI大模型面试高频题及应对策略!
  • 百度网盘无客户端高速解析:突破下载限制的完整指南
  • OpenClaw定时任务设置:百川2-13B-4bits量化模型实现早间资讯推送
  • 智能资金概念:算法交易指标工具的实战应用指南
  • DLL缺失问题的系统解决方案:使用GitHub加速计划vc/vcredist实现Visual C++运行库统一管理
  • RePKG:开源工具驱动的资源处理效率提升方案
  • 【仅限首批读者】Python多解释器调试工具链首发:支持跨ISOLATE断点追踪的pdb++增强版限时开放
  • HTTP 302重定向实战:如何解决图片突然不显示的问题(附排查步骤)
  • 无网环境下的containerd部署实战:从静态二进制到服务就绪
  • 智慧课堂行为识别 课堂行为自动分析数据集 老师教学状态监测 学生专注度评估数据集 智慧教育场景 课堂专注度识别 YOLO26第10614期
  • AI魔法修图师入门必看:InstructPix2Pix快速部署教程