-
Notifications
You must be signed in to change notification settings - Fork 125
/
Copy pathobzva.go
127 lines (108 loc) ยท 2.96 KB
/
obzva.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/*
ํ์ด 1
- lists๋ฅผ ์ํํ๋ฉด์ ์์๋๋ก ๋งํฌ๋๋ฆฌ์คํธ ๋ ๊ฐ๋ฅผ ์ง ์ง์ด ๋ณํฉํ๋ ๋ฐฉ์์ผ๋ก ํ์ดํ ์ ์์ต๋๋ค
Big O
- K: ๋ฐฐ์ด lists์ ๊ธธ์ด
- N: ๋ชจ๋ ๋งํฌ๋๋ฆฌ์คํธ์ ๋
ธ๋ ๊ฐ์์ ํฉ
- n_i: i๋ฒ ์ธ๋ฑ์ค ๋งํฌ๋๋ฆฌ์คํธ์ ๋
ธ๋์ ๊ฐ์
- Time complexity: O(KN)
- K-1 ๋ฒ์ ๋ณํฉ์ ์งํํฉ๋๋ค
- i๋ฒ์งธ ๋ณํฉ ๋, ๋ณํฉํ๋ ๋ ๋งํฌ๋๋ฆฌ์คํธ๋ ๊ฐ๊ฐ ๐บ(n_(i-1)), n_i์
๋๋ค
์ด ๋ ๐บ(n_(i-1))์ ์ํ์ ๊ณ ๋ คํ๋ค๋ฉด ๋ ๋งํฌ๋๋ฆฌ์คํธ์ ๋ณํฉ์ ๊ฑธ๋ฆฌ๋ ์๊ฐ๋ณต์ก๋๋ O(N)์
๋๋ค
- O((K-1)N) = O(KN)
- ํ์ด 2๋ก ์๊ฐ๋ณต์ก๋๋ฅผ O((logK)N)์ผ๋ก ์ต์ ํํ ์ ์์ต๋๋ค
- Space complexity: O(1)
- res, dummy, curr ๋ฑ์ ์ถ๊ฐ์ ์ธ ํฌ์ธํฐ๋ฅผ ์์ฑํ๊ธด ํ์ง๋ง ๊ธฐ์กด์ ์ฃผ์ด์ ธ ์๋ ListNode์ Next๋ง ์กฐ์ํ๋ฏ๋ก K, N๊ณผ ์๊ด ์์ด ๊ณต๊ฐ๋ณต์ก๋๋ ์์๊ฐ์ ๊ฐ์ง๋๋ค
*/
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func mergeKLists(lists []*ListNode) *ListNode {
n := len(lists)
if n == 0 {
return nil
}
res := lists[0]
for i := 1; i < n; i++ {
res = mergeTwoLists(res, lists[i])
}
return res
}
func mergeTwoLists(first *ListNode, second *ListNode) *ListNode {
dummy := &ListNode{}
curr := dummy
for first != nil && second != nil {
if first.Val < second.Val {
curr.Next = first
first = first.Next
} else {
curr.Next = second
second = second.Next
}
curr = curr.Next
}
if first != nil {
curr.Next = first
}
if second != nil {
curr.Next = second
}
return dummy.Next
}
/*
ํ์ด 2
- Divide and Conquer ๋ฐฉ์์ผ๋ก ์๊ฐ๋ณต์ก๋๋ฅผ ์ต์ ํํ ์ ์์ต๋๋ค
- ํ์ง๋ง ๊ณต๊ฐ๋ณต์ก๋ ์ธก๋ฉด์์๋ trade-off๊ฐ ์์ต๋๋ค
Big O
- K: ๋ฐฐ์ด lists์ ๊ธธ์ด
- N: ๋ชจ๋ ๋งํฌ๋๋ฆฌ์คํธ์ ๋
ธ๋ ๊ฐ์์ ํฉ
- Time complexity: O((logK)N)
- lists๋ฅผ ๋ฐ์ผ๋ก ์ชผ๊ฐ ๊ฐ๋ฉด์ ์ฌ๊ทํธ์ถ์ ์งํํ๋ฏ๋ก ์ฌ๊ทํธ์ถ์ logK ๋ ๋ฒจ์ ๊ฑธ์ณ ์ด๋ฃจ์ด์ง๋๋ค -> O(logK)
- ๊ฐ ๊ณ์ธต๋ง๋ค ์ฐ๋ฆฌ๋ ๋ชจ๋ ๋
ธ๋๋ฅผ ์ต๋ ํ ๋ฒ์ฉ ์กฐํํฉ๋๋ค -> O(N)
- Space complexity: O(logK)
- ํ์ด 1๊ณผ ๋น์ทํ์ง๋ง ์ฌ๊ทํธ์ถ ์คํ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค
*/
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func mergeKLists(lists []*ListNode) *ListNode {
n := len(lists)
if n == 0 {
return nil
}
if n == 1 {
return lists[0]
}
left := mergeKLists(lists[:n/2])
right := mergeKLists(lists[n/2:])
return mergeTwoLists(left, right)
}
func mergeTwoLists(first *ListNode, second *ListNode) *ListNode {
dummy := &ListNode{}
curr := dummy
for first != nil && second != nil {
if first.Val < second.Val {
curr.Next = first
first = first.Next
} else {
curr.Next = second
second = second.Next
}
curr = curr.Next
}
if first != nil {
curr.Next = first
}
if second != nil {
curr.Next = second
}
return dummy.Next
}