LeetCode_双指针_中等_143.重排链表

news/2024/11/24 14:08:13/

目录

  • 1.题目
  • 2.思路
  • 3.代码实现(Java)

1.题目

给定一个单链表 L 的头节点 head ,单链表 L 表示为:
L0 → L1 → … → L~n - 1~ → Ln

请将其重新排列后变为:
L0 → Ln → L1 → L~n - 1~ → L2 → L~n - 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 * 104]
1 <= node.val <= 1000

2.思路

(1)线性表存储节点
因为链表不支持下标访问,所以我们无法随机访问链表中任意位置的元素。比较容易想到的一个方法是,利用线性表存储该链表,然后利用线性表可以下标访问的特点,直接按顺序访问指定元素,重建该链表即可。

(2)寻找链表中点 & 翻转链表 & 合并链表
注意到目标链表即为将原链表的左半端和反转后的右半端合并后的结果。这样我们的任务即可划分为三步:

  • 找到原链表的中点(参考876.链表的中间结点):我们可以使用快慢指针来 O(N) 地找到链表的中间节点。
  • 将原链表的右半端反转(参考 206.反转链表):我们可以使用迭代法实现链表的反转。
  • 将原链表的两端合并:因为两链表长度相差不超过 1,因此直接合并即可。

相关题目:
LeetCode_双指针_简单_876.链表的中间结点
LeetCode_双指针_递归_简单_206.反转链表

3.代码实现(Java)

//思路1————线性表存储节点
class Solution {public void reorderList(ListNode head) {if (head == null) {return;}//使用 list 存储链表中的所有节点List<ListNode> list = new ArrayList<ListNode>();ListNode node = head;while (node != null) {list.add(node);node = node.next;}int i = 0, j = list.size() - 1;while (i < j) {list.get(i).next = list.get(j);i++;if (i == j) {break;}list.get(j).next = list.get(i);j--;}list.get(i).next = null;}
}
//思路2————寻找链表中点 & 翻转链表 & 合并链表
class Solution {public void reorderList(ListNode head) {if (head == null) {return;}ListNode mid = middleNode(head);ListNode l1 = head;ListNode l2 = mid.next;mid.next = null;l2 = reverseList(l2);mergeList(l1, l2);}//寻找链表 head 的中间节点public ListNode middleNode(ListNode head) {ListNode slow = head;ListNode fast = head;while (fast.next != null && fast.next.next != null) {slow = slow.next;fast = fast.next.next;}return slow;}//翻转链表 headpublic ListNode reverseList(ListNode head) {ListNode prev = null;ListNode curr = head;while (curr != null) { ListNode next = curr.next;curr.next = prev;prev = curr;curr = next;}return prev;}//合并链表 l1 和 l2public void mergeList(ListNode l1, ListNode l2) {ListNode l1_tmp;ListNode l2_tmp;while (l1 != null && l2 != null) {l1_tmp = l1.next;l2_tmp = l2.next;l1.next = l2;l1 = l1_tmp;l2.next = l1;l2 = l2_tmp;}}
}

http://www.ppmy.cn/news/998731.html

相关文章

快速搭建单机RocketMQ服务(开发环境)

一、什么是RocketMQ ​ RocketMQ是阿里巴巴开源的一个消息中间件&#xff0c;在阿里内部历经了双十一等很多高并发场景的考验&#xff0c;能够处理亿万级别的消息。2016年开源后捐赠给Apache&#xff0c;现在是Apache的一个顶级项目。 早期阿里使用ActiveMQ&#xff0c…

Node版本的切换之Window

步骤一&#xff1a;按健winR窗口&#xff0c;键盘输入cmd,然后回车。 步骤二&#xff1a; 输入where node&#xff0c;显示 步骤三&#xff1a;进入node.exe目录&#xff0c;并且删除父目录文件夹即&#xff1a;nodejs文件夹 步骤四&#xff1a;从官网下载版本管理并安装&#…

【Golang】基于录制,自动生成go test接口自动化用例

目录 背景 框架 ginkgo初始化 抓包&运行脚本 目录说明 ∮./business ∮./conf ∮./utils ∮./testcase testcase 用例目录结构规则 示例 实现思路 解析Har数据 定义结构体 解析到json 转换请求数据 转换请求 转换请求参数 写业务请求数据 写gotest测试…

好用的低代码开发平台是什么样的?

一、好用的低代码开发平台是什么样的&#xff1f; 从企业角度来说&#xff0c;优化流程&#xff0c;提升企业运行效率&#xff1b;节省成本&#xff0c;提高企业效益&#xff1b;维护方便&#xff0c;即改即用&#xff1b;一键升级&#xff0c;方便实用&#xff1b; 从开发者角…

DevOps系列文章之 Docker 安装 NFS 服务器

Docker 安装 NFS 服务器 环境&#xff1a; 192.186.2.105 NFS 服务器 192.168.2.106 Client 客户端 安装 一、服务器端 https://github.com/f-u-z-z-l-e/docker-nfs-server 1、创建目录 mkdir /nfsdata mkdir -p /docker/nfs/2、启动脚本 vim start.sh# 内容 docker run …

运维高级--tomcat和jpress

1. 简述静态网页和动态网页的区别。 静态网页&#xff1a;事先创建好的网页&#xff0c;通常通过HTML、CSS和JavaScript等静态文件组成&#xff0c;不需要和服务器进行交互&#xff0c;加载速度快 动态网页&#xff1a;根据用户需求动态生成网页&#xff0c;动态网页通常使用…

【docker】Windows11系统下安装并配置阿里云镜像加速

【docker】Windows11系统下安装并配置阿里云镜像加速 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【docker】Windows11系统下安装并配置阿里云镜像加速一、查看Windows环境是否支持docker二、 启动Hyper-V三、 官网下载安装Docker应用和数据…

音乐节《迷笛音乐节》游玩感

上周&#xff0c;去了烟台&#xff0c;参加音乐节&#xff0c;以前从未参加过&#xff0c;所以趁着本周六周日双休的时候&#xff0c;去游玩了一次。&#xff08;1&#xff09;一种新奇体验 对于自己来说&#xff0c;参加音乐节还是一种新奇的体验的&#xff0c;也是疫情放开了…