# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

#
#
# @param head ListNode类
# @return void
#
class Solution:
    def reorderList(self, head):
        # write code here
        if head == None or head.next == None or head.next.next == None:
            return head

        # 1 -> 2 -> 3
        # 1 -> 2 -> 3 -> 4
        # 找到链表中间位置,将链表分解为2个
        # p1,p2快慢指针,p1最终为前半段链表最后一个元素,p2遍历到原链表最后1个元素退出
        p1,p2 = head,head
        while p2.next !=None and p2.next.next !=None:
            p1 = p1.next
            p2 = p2.next.next

        #p1先赋值给half_raw,half_raw为后半段链表开头。
        #p1再将下个元素赋为None,前半段链表结束。
        half_raw = p1.next
        p1.next = None 

        # 翻转后半段链表
        half_new = None
        p = half_raw       
        while p !=None:
            temp = p.next
            p.next = half_new
            half_new = p
            p = temp

        # 合并前、后两个链表
        p1 = head
        p2 = half_new
        while p2!=None:
            temp1 = p1.next
            temp2 = p2.next
            p1.next = p2
            p2.next = temp1
            p2 = temp2
            p1 = temp1

        return head