class Solution:
def reorderList(self , head ):
#判断链表是否为空或仅一个节点
if not head or not head.next:
return head
#使用快慢指针来寻找中间结点
fast=head
slow=head
while fast and fast.next:
slow=slow.next#慢指针一次走一步
fast=fast.next.next#快指针一次走两步
#停止的时候,slow.next就是中间结点
#前半段链表不动,后半段链表翻转,注意这个翻转最好不要用递归的方法,在网站测试提交的时候,有些特别长的案例会因为递归深度太大被卡
link1=head
link2=slow.next
slow.next=None
cur=link2
pre=None
while cur:
tmp=cur.next
cur.next=pre
pre=cur
cur=tmp
link2=pre
#合并link1和翻转得到的link2
while link1 and link2:
#从第二个结点开始,current用来表示当前要插入结点的值
current=link2
link2=link2.next
#注意顺序不能错,要先把link1的下一个结点赋给current的下一个结点,然后改变link1的下一个结点为current
current.next=link1.next
link1.next=current
link1=link1.next.next
return head
05-16
135
04-15
1866