Skip to content

Commit b2f132a

Browse files
authored
Merge pull request #1927 from sonjh1217/main
[sonjh1217] WEEK 11 Solutions
2 parents 5e13cf6 + 067d26c commit b2f132a

File tree

3 files changed

+142
-0
lines changed

3 files changed

+142
-0
lines changed

graph-valid-tree/sonjh1217.swift

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import Foundation
2+
3+
class Solution {
4+
// O(n) time / O(n) space
5+
func validTree(_ n: Int, _ edges: [[Int]]) -> Bool {
6+
guard edges.count == n - 1 else {
7+
return false
8+
}
9+
10+
var connectedNodes = Array(repeating: [Int](), count: n)
11+
12+
for edge in edges {
13+
connectedNodes[edge[0]].append(edge[1])
14+
connectedNodes[edge[1]].append(edge[0])
15+
}
16+
17+
var isVisiteds = Array(repeating: false, count: n)
18+
var head = 0
19+
var queue = [0]
20+
isVisiteds[0] = true
21+
22+
while head < queue.count {
23+
let currentNode = queue[head]
24+
head += 1
25+
26+
for node in connectedNodes[currentNode] {
27+
guard !isVisiteds[node] else { continue }
28+
29+
isVisiteds[node] = true
30+
queue.append(node)
31+
}
32+
}
33+
34+
return isVisiteds.allSatisfy { $0 }
35+
}
36+
}

missing-number/sonjh1217.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
class Solution {
2+
// O(n) time / O(1) space
3+
func missingNumber(_ nums: [Int]) -> Int {
4+
let count = nums.count
5+
var expectedSum = count * (count + 1) / 2
6+
let actualSum = nums.reduce(0, +)
7+
return expectedSum - actualSum
8+
}
9+
}

reorder-list/sonjh1217.swift

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
/**
2+
* Definition for singly-linked list.
3+
* public class ListNode {
4+
* public var val: Int
5+
* public var next: ListNode?
6+
* public init() { self.val = 0; self.next = nil; }
7+
* public init(_ val: Int) { self.val = val; self.next = nil; }
8+
* public init(_ val: Int, _ next: ListNode?) { self.val = val; self.next = next; }
9+
* }
10+
*/
11+
class Solution {
12+
// O(n) time / O(n) space
13+
func reorderListUsingArray(_ head: ListNode?) {
14+
var nodes = [ListNode]()
15+
var node = head
16+
while node != nil {
17+
nodes.append(node!)
18+
node = node!.next
19+
}
20+
21+
node = head
22+
var fromFirstIndex = 1
23+
var fromLastIndex = nodes.count - 1
24+
25+
while fromFirstIndex <= fromLastIndex {
26+
guard node != nil, nodes.last != nil else {
27+
break
28+
}
29+
node!.next = nodes.removeLast()
30+
node = node!.next
31+
32+
guard fromFirstIndex < fromLastIndex else {
33+
break
34+
}
35+
36+
fromLastIndex -= 1
37+
node!.next = nodes[fromFirstIndex]
38+
fromFirstIndex += 1
39+
node = node!.next
40+
}
41+
42+
node?.next = nil
43+
}
44+
45+
// O(n) time / O(1) space
46+
func reorderList(_ head: ListNode?) {
47+
func findMiddle(_ head: ListNode?) -> ListNode? {
48+
var slow = head
49+
var fast = head
50+
51+
while fast?.next?.next != nil {
52+
slow = slow?.next
53+
fast = fast?.next?.next
54+
}
55+
56+
return slow
57+
}
58+
59+
var mid = findMiddle(head)
60+
61+
func reverseList(_ head: ListNode?) -> ListNode? {
62+
var prev: ListNode? = nil
63+
var curr: ListNode? = head
64+
var next: ListNode? = curr?.next
65+
66+
while curr != nil {
67+
curr?.next = prev
68+
69+
prev = curr
70+
curr = next
71+
next = next?.next
72+
}
73+
74+
return prev
75+
}
76+
77+
let reversedToMid = reverseList(mid?.next)
78+
mid?.next = nil
79+
80+
func mergeList(first: ListNode?, second: ListNode?) {
81+
var first = first
82+
var second = second
83+
84+
while first != nil {
85+
let firstTmp = first?.next
86+
first?.next = second
87+
let secondTmp = second?.next
88+
second?.next = firstTmp
89+
90+
first = firstTmp
91+
second = secondTmp
92+
}
93+
}
94+
95+
mergeList(first: head, second: reversedToMid)
96+
}
97+
}

0 commit comments

Comments
 (0)