Skip to content

Commit 1d5a358

Browse files
committed
1 parent 61a30f4 commit 1d5a358

File tree

4 files changed

+106
-0
lines changed

4 files changed

+106
-0
lines changed

82/step1.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/*
2+
Time: 21:00
3+
Space: O(1)
4+
Time: O(N)
5+
6+
先頭要素も削除されうるため、返すためのダミーノードを用意する。
7+
リスト全体をチェックしていくwhileループと、重複要素を削除するwhileループを入れ子にする。
8+
重複要素はすべて消さないといけないので、判定するためにvalを残す。
9+
*/
10+
class Solution {
11+
public:
12+
ListNode* deleteDuplicates(ListNode* head) {
13+
ListNode* dummy_head = new ListNode(0, head);
14+
ListNode* current = dummy_head;
15+
while (current) {
16+
while (current->next && current->next->next && current->next->val == current->next->next->val) {
17+
int target_val = current->next->val;
18+
while (current->next->val == target_val) {
19+
current->next = current->next->next;
20+
if (!current->next) {
21+
break;
22+
}
23+
}
24+
}
25+
current = current->next;
26+
}
27+
ListNode* result = dummy_head->next;
28+
delete dummy_head;
29+
return result;
30+
}
31+
};

82/step2_1.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/*
2+
new演算子を使用せず、deleteを不要にした。
3+
nextを何度も書くのに違和感があったのでgroup_top変数にした。
4+
チェック済みの最後尾を指すcurrentと、チェック中/同一数値の先頭を指すのgroup_topと役割を分けてわかりやすくした
5+
6+
*/
7+
class Solution {
8+
public:
9+
ListNode* deleteDuplicates(ListNode* head) {
10+
ListNode dummy_head = ListNode(0, head);
11+
ListNode* current = &dummy_head;
12+
13+
while (current) {
14+
ListNode* group_top = current->next;
15+
while (group_top && group_top->next && group_top->val == group_top->next->val) {
16+
int group_val = group_top->val;
17+
while (group_top && group_top->val == group_val) {
18+
group_top = group_top->next;
19+
}
20+
current->next = group_top;
21+
}
22+
current = current->next;
23+
}
24+
return dummy_head.next;
25+
}
26+
};

82/step2_2.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/*
2+
メソッド切り出しで多少読みやすくしたが、根本的なロジックは変わっていない。
3+
*/
4+
class Solution {
5+
public:
6+
ListNode* deleteDuplicates(ListNode* head) {
7+
ListNode dummy_head = ListNode(0, head);
8+
ListNode* current = &dummy_head;
9+
10+
while (current) {
11+
ListNode* group_top = current->next;
12+
while (group_top && group_top->next && group_top->val == group_top->next->val) {
13+
group_top = NextGroupTop(group_top);
14+
}
15+
current->next = group_top;
16+
current = current->next;
17+
}
18+
return dummy_head.next;
19+
}
20+
21+
private:
22+
23+
ListNode* NextGroupTop(ListNode* head) {
24+
ListNode* current = head;
25+
while (current && current->next && current->val == current->next->val) {
26+
current = current->next;
27+
}
28+
return current->next;
29+
}
30+
};

82/step3.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
class Solution {
2+
public:
3+
ListNode* deleteDuplicates(ListNode* head) {
4+
ListNode dummy_head = ListNode(-1, head);
5+
ListNode* current = &dummy_head;
6+
while (current) {
7+
ListNode* group_top = current->next;
8+
while (group_top && group_top->next && group_top->val == group_top->next->val) {
9+
int group_val =group_top->val;
10+
while (group_top && group_top->val == group_val) {
11+
group_top = group_top->next;
12+
}
13+
}
14+
current->next = group_top;
15+
current = current->next;
16+
}
17+
return dummy_head.next;
18+
}
19+
};

0 commit comments

Comments
 (0)