给定一个单链表 LL0→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.

">

给定一个单链表 LL0L1→…→Ln-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. 找到原链表的中点(参考「876. 链表的中间结点」)。

    • 我们可以使用快慢指针来 O(N)O(N)O(N) 地找到链表的中间节点。
  2. 将原链表的右半端反转(参考「206. 反转链表」)。

    • 我们可以使用迭代法实现链表的反转。
  3. 将原链表的两端合并。

    • 因为两链表长度相差不超过 111,因此直接合并即可。

Code


class Solution:def middleNode(self, head: ListNode) -> ListNode:slow = fast = headwhile fast.next and fast.next.next:slow = slow.nextfast = fast.next.nextreturn slowdef reverseList(self, head: ListNode) -> ListNode:prev, curr = None, headwhile curr:nextTemp = curr.nextcurr.next = prevprev = currcurr = nextTempreturn prevdef mergeList(self, l1: ListNode, l2: ListNode):while l1 and l2:l1Tmp = l1.nextl2Tmp = l2.nextl1.next = l2l1 = l1Tmpl2.next = l1l2 = l2Tmpdef reorderList(self, head: ListNode) -> None:"""Do not return anything, modify head in-place instead."""if not head:returnmiddle = self.middleNode(head)l1, l2 = head, middle.nextmiddle.next = Nonel2 = self.reverseList(l2)self.mergeList(l1, l2)

复杂度分析

  • 时间复杂度:O(N)O(N)O(N),其中 NNN 是链表中的节点数。

  • 空间复杂度:O(1)O(1)O(1)。

143. Reorder List 重排链表相关推荐

  1. Leetcode143. Reorder List重排链表

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

  2. LeetCode-笔记-143. 重排链表

    LeetCode-笔记-143. 重排链表 143. 重排链表 给定一个单链表 L:L0→L1→-→L**n-1→Ln , 将其重新排列后变为: L0→L**n→L1→L**n-1→L2→L**n-2 ...

  3. Java多重链表_Java实现 LeetCode 143 重排链表

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

  4. 【重点】LeetCode 143. Reorder List

    LeetCode 143. Reorder List Solution1: 参考网址:http://www.cnblogs.com/grandyang/p/4254860.html 这段代码有值得学习 ...

  5. 【每日一算法】重排链表

    微信改版,加星标不迷路! 每日一算法-重排链表 作者:阿广 阅读目录 ? 题目 ? 解析 ? 完整代码 1 题目 给定一个单链表 L:L0→L1→-→Ln-1→Ln , 将其重新排列后变为: L0→L ...

  6. 143. Reorder List

    /** 143. Reorder List * 11.28 by Mingyang 总体思想就是后半部分reverse然后再merge*/public void reorderList(ListNod ...

  7. 【CCCC】L2-022 重排链表 (25分),,链表遍历

    problem L2-022 重排链表 (25分) 给定一个单链表 L ​1 ​​ →L ​2 ​​ →⋯→L ​n−1 ​​ →L ​n ​​ ,请编写程序将链表重新排列为 L ​n ​​ →L ​ ...

  8. 重排链表-c语言链表法解决

    重排链表-c语言链表法解决 给定一个单链表 L 的头节点 head ,单链表 L 表示为: L0 → L1 → - → Ln - 1 → Ln 请将其重新排列后变为: L0 → Ln → L1 → L ...

  9. 【L2-022 重排链表】天梯赛L2系列详细解答

    天梯赛L2-022 重排链表 题目详情: 输入样例: 00100 6 00000 4 99999 00100 1 12309 68237 6 -1 33218 3 00000 99999 5 6823 ...

最新文章

  1. PHP去掉诡异的BOM \ufeff JSON开头包含红点
  2. ​Mysql数据读写分离(多实例配置)
  3. 成功解决_catboost.CatBoostError: Invalid cat_features[4] = 8 value: index must be < 8.
  4. 每个Java开发者都应该知道的5个JDK工具
  5. centos8 kernel source 安装_什么?你在物理机上安装Oracle总失败?那就试试Docker吧
  6. 该计算机没有运行windows无线服务器,老司机示范win7系统诊断提示此计算机上没有运行的windows无线服务的恢复方法...
  7. mysql创建数据库时使用sql/wordbench使主键(primary key)自增
  8. 【写作技巧】毕业论文写作资料搜索库大全
  9. Spark记录-Scala异常与处理
  10. 拓端tecdat|R语言逻辑回归(Logistic Regression)、回归决策树、随机森林信用卡违约分析信贷数据集
  11. Matlab 2016a 安装及破解方法
  12. GetAdaptersInfo获取网卡信息
  13. 卓文萱在北京净万家像街头卖艺似的骗子粉丝做公益绯闻男友辰亦儒看不惯假惺惺模样破口大骂
  14. 第二十四天:2019年第九届MathorCup高校数学建模挑战赛A题
  15. SecureCRT常用文件操作命令
  16. EasyAR_实现扫描识别图播放视频
  17. 客户服务呼叫中心解决方案
  18. qa 芯片测试_芯片测试的几个术语及解释
  19. Unity 游戏性能优化(4)资源优化
  20. Auto js编写微信小游戏 《一笔画完》 辅助工具--开发篇

热门文章

  1. Nginx的几个常用配置和技巧
  2. [elk]logstash grok原理
  3. DevExpress GridControl使用方法总结
  4. (原创).Net将EF运用于Oralce一 准备工作
  5. 我所遭遇过的游戏中间件---HumanIK
  6. ExtJS学习:MVC模式案例(三)
  7. C# 反射中的GetType
  8. php 卡号算法,PHP实现通过Luhn算法校验信用卡卡号是否有效_PHP
  9. linux挂载nfs显示nobady,51CTO博客-专业IT技术博客创作平台-技术成就梦想
  10. Java黑皮书课后题第5章:*5.1(统计正数和负数的个数然后计算这些数的平均值)编写程序,读入未指定个数的整数,判断读入的正数有多少个、负数有多少个,然后计算输入值的总和和平均值(不记0,浮点表示)