【Leetcode】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.

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reorder-list

思路

用堆栈将链表保存,然后交替改变节点指向。需要注意奇偶数以及最后可能出现的野节点

代码

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def reorderList(self, head: ListNode) -> None:
        """
        Do not return anything, modify head in-place instead.
        """
        if(not head):
            return
        s = []
        while(head):
            s.append(head)
            head = head.next
        i = 0
        j = len(s)-1
        while(i < j):
            s[i].next = s[j]
            i = i+1
            if(i==j):
                break
            s[j].next = s[i]
            j = j-1
        s[j].next = None

在这里插入图片描述

Leetcode-每日一题【143.重排链表 给定一个单链表L的头节点head,单链表L表示为:请将其重新排列后变为:不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 阅读详情

相关推荐

Java实现 LeetCode 143 重排链表

143. 重排链表 给定一个单链表 L:L0L1Ln-1Ln , 将其重新排列后变为: L0LnL1Ln-1L2Ln-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

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

目录1、题目2、思路3、c++代码 1、题目 给定一个单链表LLL:L0L1Ln-1Ln, 将其重新排列后变为: L0LnL1Ln-1L2Ln-2… 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例 1: 给定链表 1->2->3->4, 重新排列1->4->2->3. 示例 2: 给定链表 1->2->3->4->5, 重新排列1->5->2->4->3. 2、思路 (

林深不见鹿 的博客 3271

LeetCode重排链表

1.需要两个指针,一个指向就是从0开始,另外一个指向list中的最后一个元素。3.每次进行链表节点的构建时,进行i++或者j–,移动指针寻找下一个节点的值。不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。4.当构建完毕之后,链表结尾的指针应该指向null。输入: head = [1,2,3,4]2.链表构建完毕的条件:i和j相等时。输出: [1,4,2,3]

liyatjj的博客 421

Leetcode——重排链表

LeetCode——重排链表

如果需要沟通,可添加微信公众号找我免费答疑 2413

Leetcode——链表143.重排链表

设置循环处理全部链表中的节点,将当前元素的后继改为原链表的前驱(此时当前元素与原链表的后继断开,造成后继链表中全部节点丢失)更新三个变量,处理下一个节点,将当前元素变为prev,将next改为当前元素,将next向后移动一个节点。找到中间位置,将后半部分的链表翻转,得到新链表,将后半部分链表的节点交替插入原链表。先将第二个链表的头节点插入第一个链表中,尾向后移动,第二个链表的头节点向后移动。当移动到最后一个元素时,把当前节点直接插入到原链表的头,更新并返回新链表的头。传出值:后半部分链表的头节点。

weixin_74681777的博客 1035

Leetcode143. 重排链表

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

会流泪de鱼的博客 859

力扣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:L0L1Ln-1Ln , 将其重新排列后变为: L0LnL1Ln-1L2Ln-2… 你不能只是单纯的改变节点内部...

梦否 430

leetcode 143. 重排链表

leetcode 143. 重排链表 题目详情 题目链接 给定一个单链表 L:L0L1Ln-1Ln , 将其重新排列后变为: L0LnL1Ln-1L2Ln-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

leetcode143. 重排链表

文章目录题目:143. 重排链表基本思想:原地操作,每次寻找最后一个节点 题目:143. 重排链表 给定一个单链表 L:L0L1Ln-1Ln , 将其重新排列后变为: L0LnL1Ln-1L2Ln-2… 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例 1: 给定链表 1->2->3->4, 重新排列1->4->2->3. 示例 2: 给定链表 1->2->3->4->5, 重新排列1->5

yyf_blog 221
上一篇: 【Leetcode】Leetcode61.旋转链表
下一篇: 【Spark】spark使用aggregateByKey替代groupByKey
voidfaceless
博客等级 码龄10年 100粉丝 114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值