143. Reorder List (题目链接)
Medium
Given a singly linked list L: L0→L1→…→Ln-1→Ln,
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…
You may not modify the values in the list's nodes, only nodes itself may be changed.
Example 1:
Given 1->2->3->4, reorder it to 1->4->2->3.
Example 2:
Given 1->2->3->4->5, reorder it to 1->5->2->4->3.
方法1:一开始考虑使用递归去解决,结果超时了
class Solution:
def reorderList(self, head: ListNode) -> None:
"""
Do not return anything, modify head in-place instead.
"""
if not head:
return head
node = head
pre = head
while node.next:
pre = node
node = node.next
if node == head or pre == head:
return head
pre.next = None
node.next = self.reorderList(head.next)
head.next = node
return head
方法2:使用双端队列,每次去取队列的头和尾。Accepted
class Solution:
def reorderList(self, head: ListNode) -> None:
if not head:
return head
q = collections.deque()
node = head
while node:
q.append(node)
node = node.next
pre = ListNode()
while q:
front = q.popleft()
pre.next = front
if q:
tail = q.pop()
front.next = tail
pre = tail
else:
pre = front
pre.next = None
return head