LeetCode 143-重排链表

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

给定一个单链表 L 的头节点 head ,单链表 L 表示为:
L0 → L1 → … → Ln-1 → Ln
请将其重新排列后变为:
L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → …
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
实例:
输入: head = [1,2,3,4]
输出: [1,4,2,3]

解题思路:

从题目中的表述中,我们可以知晓重新排列的链表就是两个半链表合并在一起的。因此,我们可以对这个过程进行模拟。
具体:

  1. 找到链表中间点,断开连接,形成两个半链表
  2. 反转其中一个链表(后面的半链表)
  3. 将两个链表合并,形成最后的新链表

具体代码:

class Solution {
    public void reorderList(ListNode head) {
        if(head == null) return;
        // 1. 找到链表的中间节点
        ListNode fast = head;
        ListNode slow = head;
        while(fast.next != null && fast.next.next != null) {
            fast = fast.next.next;
            slow = slow.next;
        }
        ListNode midNode = slow.next;
        // 2. 断开连接
        slow.next = null;
        // 3. 反转后半链表
        ListNode newMidNode = reverse(midNode);
        // 4. 合并两个链表
        merge(head, newMidNode);
    }
	// 反转链表
    public ListNode reverse(ListNode head) {
        ListNode dummy = null;
        ListNode cur = head;
        while(cur != null) {
            ListNode nextNode = cur.next;
            cur.next = dummy;
            dummy = cur;
            cur = nextNode;
        }
        return dummy;
    }
	// 合并链表
    public void merge(ListNode l1, ListNode l2) {
        ListNode h1 = null;
        ListNode h2 = null;
        while(l1 != null && l2 != null) {
            // 记录下一个节点
            h1 = l1.next;
            h2 = l2.next;

            l1.next = l2;
            l2.next = h1;

            l1 = h1;
            l2 = h2;
        }
    }
}

原题链接

重排链表 C语言 题目描述: 给定一个单链表 L 的头节点 head单链表 L 表示为: L0 → L1 → … → Ln-1 → Ln 请将其重新排列后变为: L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → … 不能只是单纯改变节点内部,而是需要实际的进行节点交换。 示例: 输入: head = [1,2,3,4] 输出: [1,4,2,3] 输入: head = [1,2,3,4,5] 输出: [1,5,2,4,3] 解题思路: 寻找中间结点 + 链表逆转 + 合并链表 1.找到链表的中 阅读详情

相关推荐

Java实现 LeetCode 143 重排链表

143. 重排链表 给定一个单链表 L:L0→L1→…→Ln-1→Ln , 将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→… 你不能只是单纯改变节点内部,而是需要实际的进行节点交换。 示例 1: 给定链表 1->2->3->4, 重新排列为 1->4->2->3. 示例 2: 给定链表 1->2->3->4->5...

南 墙 1万+

【中等】力扣算法题解析LeetCode143重排链表

本文解决单链表重排问题,要求将链表节点按首尾交替顺序重新排列。方法分为三步: 寻找中点:使用快慢指针将链表平分为前后两部分; 反转后半部分:通过迭代法反转后半链表; 合并链表:交替连接前半部分和反转后的后半部分节点Java实现中通过断开原链表、反转及合并操作,确保空间复杂度为O(1),时间复杂度O(n)。适用于链表长度≤5×10⁴的情况,代码已通过力扣测试案例。 关键词:单链表重排、快慢指针、链表反转、交替合并

ylumwd的博客 403

LeetCode143——重排链表

我的LeetCode代码仓:https://github.com/617076674/LeetCode 原题链接:https://leetcode-cn.com/problems/reorder-list/description/ 题目描述: 知识点:双指针、链表 思路:用快慢双指针遍历链表区分链表的前半部分和后半部分 借鉴LeetCode141——环形链表LeetCode142—...

清风阁 918

算法刷题计划一----数据结构2-13(leetCode

143. 重排链表 给定一个单链表 L 的头节点 head单链表 L 表示为: L0 → L1 → … → Ln-1 → Ln 请将其重新排列后变为: L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → … 不能只是单纯改变节点内部,而是需要实际的进行节点交换。 示例 1: 输入: head = [1,2,3,4] 输出: [1,4,2,3] 示例 2: 输入: head = [1,2,3,4,5] 输出: [1,5,2,4,3] Definition for singly-lin

米修修米的博客 206

构造一个单链表L,其头结点指针为head,编写程序实现将L逆置

#include<stdio.h> #include<stdlib.h> #include<malloc.h> // 定义存储结构 typedefstruct Lnode{ intdata; /*每个元素数据信息*/ structLnode*next; /*后继元素的地址*/ }LNode,*LinkLis...

weixin_34110749的博客 4416

LeetCode:1、9、29、136、143

本篇博客主要整理LeetCode题号为:1、9、29、136、143。这五道题的个人的解题方法以及解题思路。

weixin_42307601的博客 673

给定单链表L:L0→L1→...→Ln-1→Ln, 重新排序:L0→Ln→L1→Ln-1→L2→Ln-2→...

1.重排链表 给定一个单链表 L:L0→L1→…→Ln-1→Ln , 将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→… 你不能只是单纯改变节点内部,而是需要实际的进行节点交换。 示例 1: 给定链表 1-&gt;2-&gt;3-&gt;4, 重新排列为 1-&gt;4-&gt;2-&gt;3. 示例 2: 给定链表 1-&gt;2-&gt;3-&gt;4-&gt;5, 重...

weixin_40933496的博客 4379

Leetcode143. 重排链表

Leetcode143. 重排链表 题目: 给定一个单链表 L:L0→L1→…→Ln-1→Ln , 将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→… 你不能只是单纯改变节点内部,而是需要实际的进行节点交换。 示例 1: 给定链表 1->2->3->4, 重新排列为 1->4->2->3. 示例 2: 给定链表 1->2->3->4->5, 重新排列为 1->5->2->4->3. 题解: 1.定义

会流泪de鱼的博客 858

力扣143重排链表

本文详解LeetCode 143重排链表问题的核心解法,通过三步法实现链表结构重组:① 快慢指针法精准定位链表中点(时间复杂度O(n));② 原地反转后半链表,详细图解指针操作避免节点丢失(包含暂存next节点等关键技巧);③ 双指针交叉合并两段链表,配合示意图解析节点连接顺序。提供Java代码实现并对比数组解法,强调O(1)空间复杂度优势。深入探讨快慢指针边界条件(fast.next与fast.next.next双校验),解析链表反转时pre/cur/temp三指针协作机制,适合算法面试备考及链表操作进阶

小比特,大梦想 755

力扣(LeetCode143 重排链表Java

使用栈的方式来实现对链表重排

tengfei308的博客 386

链表-143.重排链表-力扣(LeetCode)

black_bear_white的博客 409

LeetCode143题_重排链表

给定一个单链表 L 的头节点 head单链表 L 表示为:请将其重新排列后变为:不能只是单纯改变节点内部,而是需要实际的进行节点交换。

qq_40263592的博客 1293

leetcode-143 | 重排链表

title: leetcode-143 | 重排链表 date: 2019-5-13 17:12:50 comments: true categories: “leetcode” tags: - leetcode 中等难度 - 链表 题目描述 给定一个单链表 L:L0→L1→…→Ln-1→Ln , 将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→… 你不能只是单纯改变节点内部...

梦否 430

leetcode 143. 重排链表

leetcode 143. 重排链表 题目详情 题目链接 给定一个单链表 L:L0→L1→…→Ln-1→Ln , 将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→… 你不能只是单纯改变节点内部,而是需要实际的进行节点交换。 示例 1: 给定链表 1->2->3->4, 重新排列为 1->4->2->3. 示例 2: 给定链表 1->2->3->4->5, 重新排列为 1->5->2->4->3.

qq_33789406的博客 121

力扣143.重排链表

给定一个单链表L的头节点head单链表L表示为:请将其重新排列后变为:不能只是单纯改变节点内部,而是需要实际的进行节点交换。[1,4,2,3]

2501_93509832的博客 560

golang力扣leetcode 143.重排链表

143.重排链表143.重排链表题解代码 143.重排链表 143.重排链表 题解 找到中点断开,翻转后面部分,然后合并前后两个链表 重建该链表 两种实现方式 代码 package main type ListNode struct { Val int Next *ListNode } //找到中点断开,翻转后面部分,然后合并前后两个链表 func reorderList1(head *ListNode) { if head == nil { return } mid := findM

清风 550

LeetcodeLeetcode143.重排链表

Leetcode143.重排链表 题目 给定一个单链表 L:L0→L1→…→Ln-1→Ln , 将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→… 你不能只是单纯改变节点内部,而是需要实际的进行节点交换。 示例 1: 给定链表 1->2->3->4, 重新排列为 1->4->2->3. 示例 2: 给定链表 1->2->3...

voidfaceless的博客 242

leetcode 143 重排链表

1>指针firstnext用于记录first的下一个位置的地址,指针secondnext用于记录second的下一个位置的地址;(2)定义指针first和second分别指向两个新链表头节点,将两个链表断开,即slow->next=nullptr;(3)最后,将前半部分节点构成的链表和第二部分翻转后的链表进行合并(<3>指针next用于保存正在处理的结点的下一个位置,避免指针丢失;<2>将second指向的结点接入first指向的结点的后面;<1>首先,将next的修改为current的next;

2301_80296866的博客 791
上一篇: LeetCode 20-有效的括号
下一篇: LeetCode 61-旋转链表
Guo_Chuang
博客等级 码龄6年 9粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值