跳到主要内容

Reorder List

描述

Given a singly linked list L:L0L1Ln1LnL: L_0 \rightarrow L_1 \rightarrow \cdots \rightarrow L_{n-1} \rightarrow L_n, reorder it to: L0LnL1Ln1L2Ln2L_0 \rightarrow L_n \rightarrow L_1 \rightarrow L_{n-1} \rightarrow L_2 \rightarrow L_{n-2} \rightarrow \cdots

You must do this in-place without altering the nodes' values.

For example, Given {1,2,3,4}, reorder it to {1,4,2,3}.

分析

题目规定要 in-place,也就是说只能使用O(1)的空间。

可以找到中间节点,断开,把后半截单链表 reverse 一下,再合并两个单链表。

代码

# Reorder List
# 时间复杂度O(n),空间复杂度O(1)
class Solution:
def reorderList(self, head):
if head is None or head.next is None: return

slow, fast = head, head
prev = None
while fast and fast.next:
prev = slow
slow = slow.next
fast = fast.next.next
prev.next = None # cut at middle

slow = self.reverse(slow)

# merge two lists
curr = head
while curr.next:
tmp = curr.next
curr.next = slow
slow = slow.next
curr.next.next = tmp
curr = tmp
curr.next = slow

def reverse(self, head):
if head is None or head.next is None: return head

prev = head
curr = head.next
next = curr.next
while curr:
curr.next = prev
prev = curr
curr = next
next = next.next if next else None
head.next = None
return prev