Given a singly linked list L: L0→L1→…→Ln-1→Ln,
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…
You may not modify the values in the list’s nodes, only nodes itself may be changed.
Example 1:
Given 1->2->3->4, reorder it to 1->4->2->3.
Example 2:
Given 1->2->3->4->5, reorder it to 1->5->2->4->3.
计划是遍历 反转 插入,这个顺序去做,时间复杂度基本就是O(n)了
func reorderList(head *ListNode) {
if head == nil || head.Next == nil {
return
}
fast, slow := head, head
for fast.Next != nil && fast.Next.Next != nil {
fast = fast.Next.Next
slow = slow.Next
}
mid := slow.Next
slow.Next = nil
tail := mid
var preNode *ListNode = nil
for tail != nil {
n := tail.Next
tail.Next = preNode
preNode = tail
tail = n
}
//reverse
for head != nil && preNode != nil {
n := head.Next
head.Next = preNode
preNode = preNode.Next
head.Next.Next = n
head = n
}
}
来源:CSDN
作者:圆滚滚coder
链接:https://blog.csdn.net/weixin_44555304/article/details/104420830