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

LeetCode 143.重排链表

1.题目要求:将原链表重排序为:第一个节点->最后一个节点->第二个节点->倒数第二个节点->第三个节点->倒数第三个节点...。

2.思路:

以1->2->3->4->5为例。

(1)找到链表的中间节点middleNode:快慢指针法,找到中间节点mid = 3。

(2)翻转后半部分的链表reverseList:从中点开始反转后半部分的链表。反转后:1->2->3,5->4->3(注意3是共享节点)。

(3)交错合并:两个链表的节点从前往后逐个交错合并。

3.复杂度分析:

(1)时间复杂度:O(n),其中n为链表的长度。

(2)空间复杂度:O(1),仅用到若干额外变量。

4.疑问:循环条件while head2.next为什么不能写成while head2?(在hot100 234.回文链表中是while(head 2!=null),这里却是while(head2.next != null)

答:

这里不用head2 != null是为了防止形成环, 由于mid节点是重排链表后的最后一个节点,因此当head2刚走到mid时:

(1)要么此时head1也指向mid(此时对应于链表是奇数的情况)

(2)要么此时head1指向mid节点的前一个节点(对应于链表是偶数的情况)

无论哪种情况都表明这个链表已经在head2刚走到mid时重排完成,因此可以直接退出循环,再继续循环到head2 == null会形成环。

附代码:

class Solution { public void reorderList(ListNode head) { ListNode mid = middleNode(head); ListNode head2 = reverseList(mid); // 这里不用head2 != null是为了防止形成环 // 由于mid节点是重排链表后的最后一个节点 // 因此当head2刚走到mid时 // (1)要么此时head1也指向mid(此时对应于链表是奇数的情况) // (2)要么此时head1指向mid节点的前一个节点(对应于链表是偶数的情况) // 无论哪种情况都表明这个链表已经重排完成,因此可以直接退出循环,再继续循环下去会形成环 while(head2.next != null){ ListNode next1 = head.next; ListNode next2 = head2.next; head.next = head2; head2.next = next1; head = next1; head2 = next2; } } // 876.链表的中间节点,快慢指针法 private ListNode middleNode(ListNode head){ ListNode slow = head; ListNode fast = head; while(fast != null && fast.next != null){ slow = slow.next; fast = fast.next.next; } return slow; } // 206.反转链表 private ListNode reverseList(ListNode head){ ListNode pre = null; ListNode cur = head; while(cur != null){ ListNode tmp = cur.next; cur.next = pre; pre = cur; cur = tmp; } return pre; } }

ACM模式:

import java.util.Scanner; // 将 ListNode 定义为独立的类 class ListNode { int val; ListNode next; ListNode(int val) { this.val = val; this.next = null; } } public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 读取链表长度 int n = scanner.nextInt(); // 读取链表元素 int[] nums = new int[n]; for (int i = 0; i < n; i++) { nums[i] = scanner.nextInt(); } // 创建链表 ListNode head = null; if (n > 0) { head = new ListNode(nums[0]); ListNode current = head; for (int i = 1; i < n; i++) { current.next = new ListNode(nums[i]); current = current.next; } } // 调用重排链表方法 Solution solution = new Solution(); solution.reorderList(head); // 输出重排后的链表 if (head == null) { System.out.println(""); } else { ListNode current = head; while (current != null) { System.out.print(current.val); if (current.next != null) { System.out.print(" "); } current = current.next; } System.out.println(); } scanner.close(); } } // 重排链表方法放在 Solution 类中 class Solution { public void reorderList(ListNode head) { if (head == null || head.next == null) { return; } ListNode mid = middleNode(head); ListNode head2 = reverseList(mid); while (head2.next != null) { ListNode next1 = head.next; ListNode next2 = head2.next; head.next = head2; head2.next = next1; head = next1; head2 = next2; } } // 876. 链表的中间节点,快慢指针法 private ListNode middleNode(ListNode head) { ListNode slow = head; ListNode fast = head; while (fast != null && fast.next != null) { slow = slow.next; fast = fast.next.next; } return slow; } // 206. 反转链表 private ListNode reverseList(ListNode head) { ListNode pre = null; ListNode cur = head; while (cur != null) { ListNode tmp = cur.next; cur.next = pre; pre = cur; cur = tmp; } return pre; } }
http://www.jsqmd.com/news/735215/

相关文章:

  • 从零开始:如何为你的Switch打造一个安全又强大的自制系统环境
  • LoCoBench-Agent:长上下文LLM智能体评估框架解析
  • 别再手搓SVG了!用Vue3+SVG.js快速搭建电力系统拓扑图(附完整代码)
  • AI智能体记忆系统:双记忆架构与工程化部署实战
  • VSCode 2026在龙芯3A6000/申威SW64平台启动失败?3步定位固件层ABI不兼容,附中科院软件所验证版runtime patch(限时开放下载)
  • 开源技能管理:构建团队知识资产与高效学习路径
  • B站Index-1.9B:轻量级文本嵌入模型原理、部署与RAG实战
  • 魔兽争霸3兼容性问题终极解决方案:WarcraftHelper让你的老游戏焕发新生
  • 初创公司利用 Taotoken 快速集成 AI 能力并规避供应商锁定
  • GPT_ALL:基于异步函数调用的模块化AI助手框架深度解析与实践
  • 从零构建编码智能体:基于ReAct架构的AI编程助手实现指南
  • 别再重装PHP了!AI聊天机器人在PHP 9.0下“假死”却不报错?揭秘Fiber::getCurrent()返回null的3个隐藏条件与防御性编码模板
  • 2026年混凝土护栏厂家盘点:钢筋混凝土护栏/钢筋混凝土栏杆/预制仿木护栏/预制仿木栏杆/仿树藤护栏/四川水泥栏杆厂家/选择指南 - 优质品牌商家
  • 异构GPU架构KHEPRI:性能与能效的革新设计
  • 大语言模型在金融高频决策中的应用与优化
  • BusHound_v6.0.1破解版
  • LTX-2音视频框架:深度学习与信号处理的智能融合
  • 如何永久保存微信聊天记录:WeChatMsg终极指南与AI数据分析实战
  • WarcraftHelper:5分钟让你的魔兽争霸3重获新生
  • 二维码修复终极指南:使用QRazyBox免费拯救损坏的二维码
  • 【滤波跟踪】基于无迹卡尔曼滤波法从GNSS伪距离观测中确定接收机位置附matlab代码
  • 别再只盯着RSA2048了:OpenSSL实战生成RSA3072密钥对(附命令详解)
  • Arm Neoverse MMU S3架构解析与内存管理优化
  • 【PHP 9.0异步编程实战白皮书】:企业级AI聊天机器人高并发架构设计与零延迟响应落地指南
  • ok-ww鸣潮自动化工具实用指南:3分钟配置,彻底解放双手
  • 如何用OpenLyrics打造完美的foobar2000歌词体验:从零开始的完整指南
  • 告别依赖冲突!手把手教你为Franka Panda/FR3源码编译libfranka 0.10.0(附常见克隆失败解决方案)
  • Python实现全站链接爬取工具-助力打造AI知识库
  • DRM互操作性解决方案:Coral联盟与NEMO技术解析
  • PHP Swoole 与大模型深度协同的长连接设计范式(LLM Token流精准控制、心跳保活、上下文隔离三重权威实践)