Skip to content

Latest commit

Β 

History

History
74 lines (63 loc) Β· 2.09 KB

invidam.go.md

File metadata and controls

74 lines (63 loc) Β· 2.09 KB

Intuition

μž¬κ·€ν•¨μˆ˜λ₯Ό μ΄μš©ν•œ 풀이λ₯Ό μƒκ°ν•˜μ˜€μœΌλ‚˜, 맨 뒀에 μžˆλŠ” μš”μ†Œκ°€ 2번째 κΉŒμ§€ μž₯거리 이동해야 ν•˜λ―€λ‘œ 맨 λ’€λ₯Ό O(1)에 μ ‘κ·Όν•˜κΈ° μœ„ν•œ 방법(배열을 λ– μ˜¬λ¦Ό)이 ν•„μš”ν•  것이닀.

  1. Dequeμ•ˆμ— λͺ¨λ“  λ…Έλ“œλ“€μ„ μ‚½μž…ν•œλ‹€.
    • μ½”λ“œμ—μ„œλŠ” λ°°μ—΄(nodes)와 두 인덱슀(i, j)κ°€ Deque의 역할을 λŒ€μ‹ ν•œλ‹€.
  2. 맨 μ•ž, 맨 λ’€μ—μ„œ ν•˜λ‚˜μ”©μ„ λΊ€λ‹€. (f, b)
  3. 맨 μ•ž μš”μ†Œ 뒀에 맨 λ’€ μš”μ†Œλ₯Ό λ„£λŠ”λ‹€. (f --> b -- (κΈ°μ‘΄) f.Next)
  4. reorder이후 맨 λ§ˆμ§€λ§‰ μš”μ†Œμ— nil을 μΆ”κ°€ν•΄ μ’…λ£Œ 지점을 λ§Œλ“ λ‹€.

Complexity

  • Time complexity: $O(n)$
    • λ§ν¬λ“œ 리슀트의 길이 n에 λŒ€ν•˜μ—¬, λ§ν¬λ“œλ¦¬μŠ€νŠΈ μˆœνšŒμ™€ λ°°μ—΄ 순회 λΉ„μš© n이 λ°œμƒν•œλ‹€.
  • Space complexity: $O(n)$
    • λ§ν¬λ“œ 리슀트의 길이 n에 λŒ€ν•˜μ—¬, λ°°μ—΄(nodes) 생성에 λΉ„μš© n이 λ°œμƒν•œλ‹€.

Code

Two Pointer(Deque)

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
	}
}

: 인덱슀 μ‘°μ ˆν•˜λŠ” 게 κ½€λ‚˜ μ–΄λ €μ›Œμ„œ μ†”λ£¨μ…˜μ„ μ°Έκ³ ν–ˆλ‹€...