μ¬κ·ν¨μλ₯Ό μ΄μ©ν νμ΄λ₯Ό μκ°νμμΌλ, 맨 λ€μ μλ μμκ° 2λ²μ§Έ κΉμ§ μ₯거리 μ΄λν΄μΌ νλ―λ‘ λ§¨ λ€λ₯Ό O(1)
μ μ κ·ΌνκΈ° μν λ°©λ²(λ°°μ΄μ λ μ¬λ¦Ό)μ΄ νμν κ²μ΄λ€.
- Dequeμμ λͺ¨λ λ
Έλλ€μ μ½μ
νλ€.
- μ½λμμλ λ°°μ΄(
nodes
)μ λ μΈλ±μ€(i
,j
)κ°Deque
μ μν μ λμ νλ€.
- μ½λμμλ λ°°μ΄(
- 맨 μ, 맨 λ€μμ νλμ©μ λΊλ€. (
f
,b
) - 맨 μ μμ λ€μ 맨 λ€ μμλ₯Ό λ£λλ€. (
f
-->b
-- (κΈ°μ‘΄)f.Next
) - reorderμ΄ν 맨 λ§μ§λ§ μμμ
nil
μ μΆκ°ν΄ μ’ λ£ μ§μ μ λ§λ λ€.
- Time complexity:
$O(n)$ - λ§ν¬λ 리μ€νΈμ κΈΈμ΄
n
μ λνμ¬, λ§ν¬λ리μ€νΈ μνμ λ°°μ΄ μν λΉμ©n
μ΄ λ°μνλ€.
- λ§ν¬λ 리μ€νΈμ κΈΈμ΄
- Space complexity:
$O(n)$ - λ§ν¬λ 리μ€νΈμ κΈΈμ΄
n
μ λνμ¬, λ°°μ΄(nodes
) μμ±μ λΉμ©n
μ΄ λ°μνλ€.
- λ§ν¬λ 리μ€νΈμ κΈΈμ΄
func reorderListv1(head *ListNode) {
nodes := make([]*ListNode, 0, 25)
for curr := head; curr != nil; curr = curr.Next {
nodes = append(nodes, curr)
}
i, j := 0, len(nodes)-1
for i < j {
nodes[j].Next = nodes[i].Next
nodes[i].Next = nodes[j]
i++
j--
}
nodes[i].Next = nil
}
: μ루μ
μ 보며 λ€μͺ½ μ λ°μ reverse()
νμ¬ ν΄κ²°νλ μ루μ
μ΄ λμ± μ§κ΄μ μΌλ‘ λκ»΄μ‘λ€.
func reverse(node *ListNode) *ListNode {
var prev *ListNode
curr := node
for curr != nil {
next := curr.Next
curr.Next = prev
prev = curr
curr = next
}
return prev
}
func reorderList(head *ListNode) {
slow, fast := head, head
for fast != nil && fast.Next != nil {
fast = fast.Next.Next
slow = slow.Next
}
curr, rCurr := head, reverse(slow.Next)
slow.Next = nil
for curr != nil && rCurr != nil {
next, rNext := curr.Next, rCurr.Next
rCurr.Next = next
curr.Next = rCurr
curr, rCurr = next, rNext
}
}
: μΈλ±μ€ μ‘°μ νλ κ² κ½€λ μ΄λ €μμ μ루μ μ μ°Έκ³ νλ€...