返回

算法精要143:巧解重排链表,揭开最优方案

前端

排序规则与问题剖析

重排链表问题,旨在将原链表重组为顺序排列的两个链表,如1->2->3->4->5->6应重排为1->6->2->5->3->4。

算法步骤

  1. 寻找链表中点:

利用快慢指针技巧,快指针每次走两步,慢指针每次走一步。当快指针到达末尾时,慢指针恰好位于中点。

  1. 断开链表:

在中点处将链表断开,形成两条链表。

  1. 翻转后半部分链表:

将后半部分链表翻转,使其顺序与前半部分链表相同。

  1. 合并两个链表:

将翻转后的后半部分链表与前半部分链表交替合并,形成重排后的链表。

代码实现

def reorderList(head):
    """
    重排链表

    Args:
        head: 链表头节点

    Returns:
        重排后的链表头节点
    """

    # 寻找链表中点
    slow = head
    fast = head.next
    while fast and fast.next:
        slow = slow.next
        fast = fast.next.next

    # 断开链表
    second_half = slow.next
    slow.next = None

    # 翻转后半部分链表
    prev = None
    while second_half:
        next_node = second_half.next
        second_half.next = prev
        prev = second_half
        second_half = next_node

    # 合并两个链表
    first_half = head
    while first_half and prev:
        next_node_first_half = first_half.next
        next_node_prev = prev.next

        first_half.next = prev
        prev.next = next_node_first_half

        first_half = next_node_first_half
        prev = next_node_prev

    return head

复杂度分析

  • 时间复杂度:O(n),其中n为链表的长度。
  • 空间复杂度:O(1),因为算法不需要额外空间。

结语

掌握重排链表算法,不仅能助你应对面试,更能提升你对链表的理解和运用。期待你在编程道路上更进一步。