返回
算法精要143:巧解重排链表,揭开最优方案
前端
2024-01-16 08:34:01
排序规则与问题剖析
重排链表问题,旨在将原链表重组为顺序排列的两个链表,如1->2->3->4->5->6应重排为1->6->2->5->3->4。
算法步骤
- 寻找链表中点:
利用快慢指针技巧,快指针每次走两步,慢指针每次走一步。当快指针到达末尾时,慢指针恰好位于中点。
- 断开链表:
在中点处将链表断开,形成两条链表。
- 翻转后半部分链表:
将后半部分链表翻转,使其顺序与前半部分链表相同。
- 合并两个链表:
将翻转后的后半部分链表与前半部分链表交替合并,形成重排后的链表。
代码实现
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),因为算法不需要额外空间。
结语
掌握重排链表算法,不仅能助你应对面试,更能提升你对链表的理解和运用。期待你在编程道路上更进一步。