(链表) 143. 重排链表 ——【Leetcode每日一题】

news/2025/3/5 0:17:40/

❓143. 重排链表

难度:中等

给定一个单链表 L 的头节点 head ,单链表 L 表示为:

L 0 L_0 L0 L 1 L_1 L1 → … → L n − 1 L_{n-1} Ln1 L n L_n Ln

请将其重新排列后变为:

L 0 L_0 L0 L n L_n Ln L 1 L_1 L1 L n − 1 L_{n-1} Ln1 L 2 L_2 L2 L n − 2 L_{n-2} Ln2 → …

不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例 1:

在这里插入图片描述

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

示例 2:

在这里插入图片描述

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

提示

  • 链表的长度范围为 [ 1 , 5 ∗ 1 0 4 ] [1, 5 * 10^4] [1,5104]
  • 1 < = n o d e . v a l < = 1000 1 <= node.val <= 1000 1<=node.val<=1000

💡思路:寻找链表中点 + 链表逆序 + 合并链表

  1. 使用 快慢指针 寻找链表中点,将链表分割成两个链表;
  2. 然后把第二个链表利用 头插法 反转;
  3. 之后在通过两个链表拼接成新的链表,将第二个链表插到第一个链表。

🍁代码:(Java、C++)

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 void reorderList(ListNode head) {ListNode slow = head, fast = head.next;while(fast != null && fast.next != null){//找到中间节点slow = slow.next;fast = fast.next.next;}fast = slow.next;//后半部分的第一个if(fast == null) return;slow.next = null;//截断为两部分//将后半部分头插法进行重排序ListNode h = fast;fast = h.next;h.next = null;while(fast != null){slow = fast;fast = fast.next;slow.next = h;h = slow;}//前后两部分合并slow = head;//指向前半部分fast = h;//指向后半部分while(fast != null){//将后半部分插入到前半部分fast = fast.next;h.next = slow.next;slow.next = h;slow = h.next;h = fast;}}
}

C++

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:void reorderList(ListNode* head) {ListNode* slow = head;ListNode* fast = head->next;while(fast != nullptr && fast->next != nullptr){slow = slow->next;fast = fast->next->next;}fast = slow->next;//后半部分的第一个if(fast == nullptr) return;slow->next = nullptr;//截断为两部分//将后半部分头插法进行重排序ListNode* h = fast;fast = h->next;h->next = nullptr;while(fast != nullptr){slow = fast;fast = fast->next;slow->next = h;h = slow;}//前后两部分合并slow = head;fast = h;while(fast != nullptr){fast = fast->next;h->next = slow->next;slow->next = h;slow = h->next;h = fast;}}
};

🚀 运行结果:

在这里插入图片描述

🕔 复杂度分析:

  • 时间复杂度 O ( n ) O(n) O(n),其中 n 是链表中的节点数。
  • 空间复杂度 O ( 1 ) O(1) O(1)

题目来源:力扣。

放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我LeetCode主页 / CSDN—力扣专栏,每日更新!

注: 如有不足,欢迎指正!


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

相关文章

【Maven】私服

文章目录 私服一、Nexus的下载与安装二、仓库分类三、手动资源上传四、本地仓库访问私服五、Idea访问私服及组件上传 私服 之前提到过私服&#xff08;仓库&#xff09;的概念&#xff1a; 仓库&#xff1a;顾名思义就是用于存储资源的地方 - 包含各种jar包本地仓库&#xff1…

Maven私服地址

一、问题 现在maven项目非常流行&#xff0c;因为我们可以在pom.xml文件中配置项目所需要的jar包对应的坐标&#xff0c;maven就会自动管理jar包&#xff0c;但如果使用maven的中央仓库&#xff0c;因为其仓库服务器在国外&#xff0c;因此jar下载的速度非常慢&#xff0c;这时…

Mina使用

在android项目中&#xff0c;与代理服务器之间通信一般都是采用TCP&#xff0c;由于在项目中要实现的功能中还有心跳&#xff0c;需要定时与服务器进行心跳交互&#xff0c;另外客户端要随时准备接收来自服务器的消息&#xff0c;因此采用了Mina&#xff0c;发现Mina使用起来挺…

Mahalanobis(马氏)距离

当提到距离的时候&#xff0c;一般都会想到欧氏距离&#xff0c;更远一些还会想到范数&#xff0c;我们熟悉的欧式距离虽然很有用&#xff0c;但是也有明显的缺点&#xff0c;它将样本的不同属性&#xff08;特征&#xff09;之间的差别等同对待&#xff0c;但是在很多时候&…

MINA框架概述

1&#xff0e;MINA框架简介MINA(Multipurpose Infrastructure for Network Applications)是用于开发高性能和高可用性的网络应用程序的基础框架。通过使用MINA框架可以可以省下处理底层I/O和线程并发等复杂工作&#xff0c;开发人员能够把更多的精力投入到业务设计和开发当中。…

maven --私服

一、私服简介 私服是一台独立的服务器&#xff0c;用于解决团队内部的资源共享与资源同步问题 Nexus--Sonatype公司的一款maven私服产品 下载完成后解压 &#xff08;1&#xff09;启动服务器 如何使用这个服务器 &#xff1f; &#xff08;2&#xff09;使用服务器 在浏…

玛雅人的故乡

“一道耀眼的亮光伴随着呼啸的响声划破了夜空的寂静。随之而来的是惊天动地的爆炸&#xff0c;巨大的蘑菇云腾空而起&#xff0c;刹那间山崩地裂、天昏地暗&#xff0c;世界笼罩在黑暗之中长达一年之久。饥饿和寒冷迫使统治地球长达一亿五千万年之久的恐龙灭绝了。”这是科学家…

Maven-私服简介

Maven 仓库管理也叫 Maven 私服或者代理仓库。使用私服可以用来管理公司自己的jar。 Nexus 是一个强大的 Maven 仓库管理工具&#xff0c;使用 Nexus 可以方便的管理内部仓库 同时简化外部仓库的访问。官网是&#xff1a;https://www.sonatype.com/ 1.打开命令行&#xff0c;…