赞
踩
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 } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。