欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

143. Reorder List 重排链表

发布时间:2024/5/17 编程问答 53 豆豆
生活随笔 收集整理的这篇文章主要介绍了 143. Reorder List 重排链表 小编觉得挺不错的,现在分享给大家,帮大家做个参考.
给定一个单链表 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.

">

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

寻找链表中点 + 链表逆序 + 合并链表

注意到目标链表即为将原链表的左半端和反转后的右半端合并后的结果。

这样我们的任务即可划分为三步:

  • 找到原链表的中点(参考「876. 链表的中间结点」)。

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

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

    • 因为两链表长度相差不超过 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 重排链表的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。