Leetcode143. 重排链表

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

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.定义快慢指针,慢指针走一步,快指针走两步,当快指针到达null时,慢指针走一半,此时的慢指针刚好是链表的中间点;
2.拿到慢指针的节点,将慢指针给另一个指针pre,再将前后两部分链表断开,翻转后半部分链表;
3.将前后两部分链表链接起来即可。

1 -> 2 -> 3 -> 4 -> 5 -> 6
第一步,将链表平均分成两半
1 -> 2 -> 3
4 -> 5 -> 6
    
第二步,将第二个链表逆序
1 -> 2 -> 3
6 -> 5 -> 4
    
第三步,依次连接两个链表
1 -> 6 -> 2 -> 5 -> 3 -> 4

java代码:

  /**
     * @param head
     */
    public static void reorderList(ListNode head) {
        if (head == null || head.next == null || head.next.next == null) {
            return;
        }
        ListNode fast = head;
        ListNode slow = head;
        while (fast.next != null && fast.next.next != null) {
            slow = slow.next;
            fast = fast.next.next;
        }
        ListNode pre = slow.next;
        //断开前后两个链表
        slow.next = null;
         pre = reverse(pre);


        //链表节点依次连接
        while (pre!=null){
            ListNode tmp = pre.next;
            pre.next=head.next;
            head.next=pre;
            head=pre.next;
            pre =tmp;
        }



    }

    /**
     * 翻转链表
     *
     * @param head
     * @return
     */
    public static ListNode reverse(ListNode head) {
        if (head == null) return null;
        ListNode pre = null;
        ListNode cur = head;
        while (cur != null) {
            ListNode tmp = cur.next;
            cur.next = pre;
            pre = cur;
            cur = tmp;

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

相关推荐

Leetcode-每日一题【143.重排链表

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

lucky_1314520的博客 757

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

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

ylumwd的博客 403

Leetcode 143. 重排链表

题目描述 给定一个单链表 L 的头节点 head ,单链表 L 表示为: L0 → L1 → … → Ln-1 → Ln 请将其重新排列后变为: L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → … 不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/reorder-list 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 Java /** * Defi

sdau_clt的博客 443

LeetCode 143. 重排链表【c++ 详细题解】

目录1、题目2、思路3、c++代码 1、题目 给定一个单链表LLL: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. 2、思路 (

林深不见鹿 的博客 3271

力扣(LeetCode)143. 重排链表(C++)

【墨染】链表操作的超级大杂烩。

墨染 1058

每日一题《leetcode--143.重排链表

第一种:用数组存储该链表,然后通过访问数组下标的方式来改变该链表的排列方式。第二种方法:我们可以用三个端口函数来实现。这道题我们可以用两种方法。将原链表的右半端反转。将原链表的两端合并。

weixin_73359101的博客 515

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万+

力扣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的博客 1301

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

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

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

leetcode143. 重排链表

文章目录题目: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->5

yyf_blog 221
上一篇: Leetcode142. 环形链表 II
下一篇: Leetcode147. 对链表进行插入排序
会流泪de鱼
博客等级 码龄9年 16粉丝 265原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值