重排链表,主要思路是因为后面的一段是从后向前的,所以考虑先把后面的断开反转,然后再合并
思路:
- 找到后面一段链表起点前一位的节点,将其指针指向空就完成了断开
- 之后将两个链表进行合并
def reorderList(self, head):
"""
:type head: ListNode
:rtype: None Do not return anything, modify head in-place instead.
"""
slow,fast = head,head
while fast.next and fast.next.next: #主要注意这里,不能直接找到第二段链表的起点,找到其前面的那个节点
slow = slow.next #因为必须要将两段分开,否则会导致环,指向第二段的起点会出现两个指针
fast = fast.next.next #所以找到其前面的那个节点,使其断开与后面的连接
p = slow.next
slow.next = None
pre = None
while p:
tmp = p.next
p.next = pre
pre = p
p = tmp
fast = head #fast移动过,重置到头节点
while pre: #后面的一段要比前面的短,所以直接拿后面的判断就行了
tmp1 = fast.next
tmp2 = pre.next
fast.next = pre
fast = tmp1
pre.next = fast
pre = tmp2