题目
将给定的单链表
L 0 →L 1→…→L n−1→L n
重新排序为:
L 0→L n→L 1 →L n−1→L 2 →L n−2 →…
要求使用原地算法,不能只改变节点内部的值,需要对实际的节点进行交换。
数据范围:链表长度 0≤n≤20000 ,链表中每个节点的值满足 0≤val≤1000
要求:空间复杂度 O(n) 并在链表上进行操作而不新建链表,时间复杂度 O(n)
进阶:空间复杂度 O(1) , 时间复杂度 O(n)
思路
找到中点,然后断开,将后面的链表反转,然后插入到前面的链表中。
代码
python版本:
# 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):
return head
# 找到中点
# 将后面的反转
# 再插入连接起来
count = 0
dummy = head
while(head):
count+=1
head = head.next
mid = count//2 if count%2==0 else count//2+1
former = dummy
for i in range(mid-1):
dummy = dummy.next
laster = dummy.next
dummy.next = None
pre = None
cur = laster
while(cur):
tmp = cur.next
cur.next = pre
pre = cur
cur = tmp
reverse_laster = pre
sg = former
while(former!=None and reverse_laster!=None):
former_tmp = former.next
reverse_laster_tmp = reverse_laster.next
former.next = reverse_laster
reverse_laster.next = former_tmp
former = former_tmp
reverse_laster = reverse_laster_tmp
return sg
c++版本:
无