143 - 重排链表 - python

101 阅读1分钟

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

根据题目的描述和给的示例可以看出,链表重排后的形式为链表的右半部分反转后的结果中的元素依次插入链表的左半部分。因此,解决该问题可以分为以下几步进行

  • 获取链表的左右两个部分,并实现右半部分链表的反转
  • 将反转后结果中的元素依次插入到左半部分
    在这里插入图片描述

AC code

class Solution:
    def reorderList(self, head: ListNode) -> None:
        """
        Do not return anything, modify head in-place instead.
        """
        if not head: return None

        # 获取链表长度
        l = 0
        cur = head
        while cur:
            l += 1
            cur = cur.next

        mid = l // 2
        cur = head
        index = 0
        # 获取左链表
        while cur and index < mid - 1:
            index += 1
            cur = cur.next
        # 获取右链表
        t = cur.next
        cur.next = None
        # 右链表反转
        right = None
        while t:
            node = ListNode(t.val)
            node.next = right
            right = node
            t = t.next
            
        l, r = head, right
        while l.next and r:
            node = ListNode(r.val)
            node.next = l.next
            l.next = node
            l = l.next.next
            r = r.next

        if r:
            l.next = r