题目:
Given a singly linked list L: L0→L1→…→Ln-1→Ln,
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…
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}
.
1. 将list从中间切成两段,并找到中间的结点 mid(findMid);
2. 对mid做链表翻转,返回翻转后的链表头 head2(reverse);
3. 将head 和 head2 做交叉合成(merge);
class Solution(object):
def reorderList(self, head):
if not head or not head.next or not head.next.next: #如果只有两个以内的结点,直接返回
return head
mid = self.findMid(head)
head2 = self.reverse(mid)
phead = self.merge(head,head2)
return phead
def findMid(self,head):
slow = head
fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
mid = slow.next
slow.next = None
return mid
def reverse(self,head):
if not head or not head.next:
return head
p_next = None
phead = head
while phead:
p = phead
phead = phead.next
p.next = p_next
p_next = p
return p_next
def merge(self,head1,head2):
phead = head1
while head2:
x = head1.next
y = head2.next
head1.next = head2
head2.next = x
head1 = head1.next.next
head2 = y
return phead