From d65b7ff8415f25eaedfafbbef2a261183ae15945 Mon Sep 17 00:00:00 2001 From: maeken4 Date: Sun, 18 May 2025 22:34:57 +0900 Subject: [PATCH 1/6] first commit --- 84.-Remove-Duplicates-from-Sorted-List-II/memo.md | 2 ++ .../step1.cpp | 15 +++++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 84.-Remove-Duplicates-from-Sorted-List-II/memo.md create mode 100644 84.-Remove-Duplicates-from-Sorted-List-II/step1.cpp diff --git a/84.-Remove-Duplicates-from-Sorted-List-II/memo.md b/84.-Remove-Duplicates-from-Sorted-List-II/memo.md new file mode 100644 index 0000000..8ebec66 --- /dev/null +++ b/84.-Remove-Duplicates-from-Sorted-List-II/memo.md @@ -0,0 +1,2 @@ +# step1 +- diff --git a/84.-Remove-Duplicates-from-Sorted-List-II/step1.cpp b/84.-Remove-Duplicates-from-Sorted-List-II/step1.cpp new file mode 100644 index 0000000..6f21925 --- /dev/null +++ b/84.-Remove-Duplicates-from-Sorted-List-II/step1.cpp @@ -0,0 +1,15 @@ +struct ListNode { + int val; + ListNode* next; + ListNode() : val(0), next(nullptr) {} + ListNode(int x) : val(x), next(nullptr) {} + ListNode(int x, ListNode* next) : val(x), next(next) {} +}; + +class Solution { + public: + ListNode* deleteDuplicates(ListNode* head) { + hoge; + hogehoge; + } +}; From d32f657dac0fee1483db8d55853d3c66102426e7 Mon Sep 17 00:00:00 2001 From: maeken4 Date: Sun, 25 May 2025 00:09:50 +0900 Subject: [PATCH 2/6] step3 --- .../memo.md | 21 ++++++++++- .../step1.cpp | 35 ++++++++++++++----- .../step2.cpp | 31 ++++++++++++++++ step3.cpp | 30 ++++++++++++++++ 4 files changed, 107 insertions(+), 10 deletions(-) create mode 100644 84.-Remove-Duplicates-from-Sorted-List-II/step2.cpp create mode 100644 step3.cpp diff --git a/84.-Remove-Duplicates-from-Sorted-List-II/memo.md b/84.-Remove-Duplicates-from-Sorted-List-II/memo.md index 8ebec66..0ad1584 100644 --- a/84.-Remove-Duplicates-from-Sorted-List-II/memo.md +++ b/84.-Remove-Duplicates-from-Sorted-List-II/memo.md @@ -1,2 +1,21 @@ # step1 -- +83と同様に、確定しているノードの次のノードの状態で場合分けして考える + +tailまで確定しているとして(最初の場合分けも必要か?)、 +- tail.next == nullptr +- tail.next が採用できる=値が連続していない +- tail.next が採用できない=tail.nextから値が連続している + +が考えられる。番兵をおけば最初を場合分けなくて済む。 + +→ややこしくなってしまいとりあえず値のカウントリストを用意して解いた。 +# step2 +新井さんの解答ではやはり重複中を走るポインタをもう一つ用意していたのでそうすればすっきり実装できそう。 + +→discordを見て削除は値で行うことに変更。 + +小田さんの電車の振り分けの比喩で考えると、各日付の作業者は各日付のうちに重複を取り除くことにしtailを引き継ぎのない重複のない状態にして次の人に引き継ぐということ。 + + +# step3 +一重目のwhileで注目しているノードをcur_nodeで置いたけどあんまりわかりやすくなっていない? diff --git a/84.-Remove-Duplicates-from-Sorted-List-II/step1.cpp b/84.-Remove-Duplicates-from-Sorted-List-II/step1.cpp index 6f21925..2f9afd5 100644 --- a/84.-Remove-Duplicates-from-Sorted-List-II/step1.cpp +++ b/84.-Remove-Duplicates-from-Sorted-List-II/step1.cpp @@ -1,15 +1,32 @@ +#include struct ListNode { - int val; - ListNode* next; - ListNode() : val(0), next(nullptr) {} - ListNode(int x) : val(x), next(nullptr) {} - ListNode(int x, ListNode* next) : val(x), next(next) {} + int val; + ListNode* next; + ListNode() : val(0), next(nullptr) {} + ListNode(int x) : val(x), next(nullptr) {} + ListNode(int x, ListNode* next) : val(x), next(next) {} }; class Solution { public: - ListNode* deleteDuplicates(ListNode* head) { - hoge; - hogehoge; - } + ListNode* deleteDuplicates(ListNode* head) { + // 値の登場回数を管理する + std::map count; + for (ListNode* p = head; p != nullptr; p = p->next) { + count[p->val]++; + } + ListNode* dummy = new ListNode(0); + dummy->next = head; + ListNode* tail = dummy; + while (tail != nullptr && tail->next != nullptr) { + if (count[tail->next->val] > 1) { + tail->next = tail->next->next; + } else { + tail = tail->next; + } + } + ListNode* ans = dummy->next; + delete dummy; + return ans; + } }; diff --git a/84.-Remove-Duplicates-from-Sorted-List-II/step2.cpp b/84.-Remove-Duplicates-from-Sorted-List-II/step2.cpp new file mode 100644 index 0000000..e8fd160 --- /dev/null +++ b/84.-Remove-Duplicates-from-Sorted-List-II/step2.cpp @@ -0,0 +1,31 @@ +struct ListNode { + int val; + ListNode* next; + ListNode() : val(0), next(nullptr) {} + ListNode(int x) : val(x), next(nullptr) {} + ListNode(int x, ListNode* next) : val(x), next(next) {} +}; + +class Solution { + public: + ListNode* deleteDuplicates(ListNode* head) { + // スタック上に動的確保することで開放しなくてよくなる + ListNode dummy(0, head); + ListNode* tail = &dummy; + // tailまでは重複がないとして次のノードから確認する + while (tail->next && tail->next->next) { + if (tail->next->val != tail->next->next->val) { + tail = tail->next; + } else { + // 重複を検知した場合、値が被っている間ノードを消していく + int val_to_remove = tail->next->val; + while (tail->next && tail->next->val == val_to_remove) { + ListNode* toDelete = tail->next; + tail->next = tail->next->next; + delete toDelete; + } + } + } + return dummy.next; + } +}; diff --git a/step3.cpp b/step3.cpp new file mode 100644 index 0000000..ef257c9 --- /dev/null +++ b/step3.cpp @@ -0,0 +1,30 @@ +struct ListNode { + int val; + ListNode* next; + ListNode() : val(0), next(nullptr) {} + ListNode(int x) : val(x), next(nullptr) {} + ListNode(int x, ListNode* next) : val(x), next(next) {} +}; + +class Solution { + public: + ListNode* deleteDuplicates(ListNode* head) { + ListNode dummy(0, head); + ListNode* tail = &dummy; + while (tail->next && tail->next->next) { + ListNode* cur_node = tail->next; + if (cur_node->val != cur_node->next->val) { + tail = cur_node; + continue; + } + int val_to_remove = cur_node->val; + while (cur_node && cur_node->val == val_to_remove) { + ListNode* to_delete = cur_node; + cur_node = cur_node->next; + delete to_delete; + } + tail->next = cur_node; + } + return dummy.next; + } +}; From 8097733fb78792159702e6c2c51bcaae4b48bf86 Mon Sep 17 00:00:00 2001 From: maeken4 Date: Sun, 25 May 2025 00:14:37 +0900 Subject: [PATCH 3/6] fix file position --- step3.cpp => 84.-Remove-Duplicates-from-Sorted-List-II/step3.cpp | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename step3.cpp => 84.-Remove-Duplicates-from-Sorted-List-II/step3.cpp (100%) diff --git a/step3.cpp b/84.-Remove-Duplicates-from-Sorted-List-II/step3.cpp similarity index 100% rename from step3.cpp rename to 84.-Remove-Duplicates-from-Sorted-List-II/step3.cpp From abec4232ca88fb6e15da2c3951bfcfa2aed75ecf Mon Sep 17 00:00:00 2001 From: maeken4 Date: Sun, 25 May 2025 14:21:53 +0900 Subject: [PATCH 4/6] add step3_2 --- .../step3_2.cpp | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 84.-Remove-Duplicates-from-Sorted-List-II/step3_2.cpp diff --git a/84.-Remove-Duplicates-from-Sorted-List-II/step3_2.cpp b/84.-Remove-Duplicates-from-Sorted-List-II/step3_2.cpp new file mode 100644 index 0000000..fdc8aa1 --- /dev/null +++ b/84.-Remove-Duplicates-from-Sorted-List-II/step3_2.cpp @@ -0,0 +1,31 @@ +struct ListNode { + int val; + ListNode* next; + ListNode() : val(0), next(nullptr) {} + ListNode(int x) : val(x), next(nullptr) {} + ListNode(int x, ListNode* next) : val(x), next(next) {} +}; + +class Solution { + public: + ListNode* deleteDuplicates(ListNode* head) { + ListNode dummy(-1, head); + ListNode* last_non_duplicate_node = &dummy; + ListNode* cur_node = last_non_duplicate_node->next; + while (cur_node && cur_node->next) { + if (cur_node->val != cur_node->next->val) { + last_non_duplicate_node = cur_node; + cur_node = cur_node->next; + continue; + } + int val_to_remove = cur_node->val; + while (cur_node && cur_node->val == val_to_remove) { + ListNode* to_delete = cur_node; + cur_node = cur_node->next; + delete to_delete; + } + last_non_duplicate_node->next = cur_node; + } + return dummy.next; + } +}; From df8dee0cfd2743352e55a8fceb4df5fd9170f3bb Mon Sep 17 00:00:00 2001 From: maeken4 Date: Sat, 31 May 2025 16:14:06 +0900 Subject: [PATCH 5/6] add test --- .../test.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 84.-Remove-Duplicates-from-Sorted-List-II/test.cpp diff --git a/84.-Remove-Duplicates-from-Sorted-List-II/test.cpp b/84.-Remove-Duplicates-from-Sorted-List-II/test.cpp new file mode 100644 index 0000000..3d295e8 --- /dev/null +++ b/84.-Remove-Duplicates-from-Sorted-List-II/test.cpp @@ -0,0 +1,15 @@ +// ポインタと参照の違い + +#include +void func(int& x) { + x += 10; + printf("%p\n", &x); +} +int main() { + int b = 10; + int& c = b; + std::cout << c << std::endl; // 10 + printf("%p\n", &b); + func(b); // bは20になる + std::cout << b << std::endl; +} From 32508ad2702b7c64d55f45023bfd816fa33358c3 Mon Sep 17 00:00:00 2001 From: maeken4 Date: Sat, 31 May 2025 22:20:39 +0900 Subject: [PATCH 6/6] step4 --- .../a.out | Bin 0 -> 16064 bytes .../memo.md | 21 ++++++++++++ .../step1.cpp | 32 ++++++++++++++++++ .../step2.cpp | 31 +++++++++++++++++ .../step3.cpp | 30 ++++++++++++++++ .../step3_2.cpp | 31 +++++++++++++++++ .../step4.cpp | 30 ++++++++++++++++ .../test.cpp | 15 ++++++++ 8 files changed, 190 insertions(+) create mode 100755 82.-Remove-Duplicates-from-Sorted-List-II/a.out create mode 100644 82.-Remove-Duplicates-from-Sorted-List-II/memo.md create mode 100644 82.-Remove-Duplicates-from-Sorted-List-II/step1.cpp create mode 100644 82.-Remove-Duplicates-from-Sorted-List-II/step2.cpp create mode 100644 82.-Remove-Duplicates-from-Sorted-List-II/step3.cpp create mode 100644 82.-Remove-Duplicates-from-Sorted-List-II/step3_2.cpp create mode 100644 82.-Remove-Duplicates-from-Sorted-List-II/step4.cpp create mode 100644 82.-Remove-Duplicates-from-Sorted-List-II/test.cpp diff --git a/82.-Remove-Duplicates-from-Sorted-List-II/a.out b/82.-Remove-Duplicates-from-Sorted-List-II/a.out new file mode 100755 index 0000000000000000000000000000000000000000..b64fa3d7c070d696be670a32aa3e5cf0e1538079 GIT binary patch literal 16064 zcmeHOZ)_Y#6`woDiPJdo#Z4NMw8^QYkkEKzJC1RROwO^-IU~mjj>A7uM(ew^ed7N0 zZZEYfR1ATtQHfL#Dn$Yb6$w7Tha!RC3&JI+0tBd$5STBO1+5eWr7nLe6NHcVcHZy2 zUe2jh_<+QYwfmd*d+*K6zM0*d_0D`eIW`iFL=;k!dbeUJ5i?9e6btW^3_(KmtDSVd zN8PQqlDx&^j6Pw2v?eV@H)4zMO@!>%!I=hlx1p&9lh8s&_S-D2G#d?2$#t-wrxF=F zFew!P!Po1HON{~inb1JLAID~;(-^D_Y{a<4<%l5sSY$tC8GGsulLQx~oj}BsW5P$j z#50IpQVcNYH!FTY92P$y*TL!H%Wme))OSJrTH{_ZDu~Ant$?WSz2xV`Mf7h3=;jHj zZ?k@gN&JBlUUfW|o$Bj7p38LRvW4ng=UjhZXJ4;XDOx>V)!eQ)9XzJaj$cw#%p!9V zMipH!GRkA!9?`S?!53fX{o&=63(;RaHSx;Ct#6Ju|MD@m;dZkR+i>FYFhp49JlDxK zCLW)loQ!S48_qBC98zL^=fY+Pwg-v*F*S!tOQCg?xY(1SV*tzT@4v7@t zw63^z+0}VFTTm=>eEZbdvC%U_y2t9VPS*1$dX*lXJf|~G*_p{!T&FyFZYWnQIFt5N zj*FYg7YkCHHl_^?If4=I&-7G;WNt6UOLc#CJ4c{ArxC_V8^!hMYUC%)V8 zt8#yXUzP$}5=IXm^3rL;b02cdkd}SCzu#~Ac#JXjS@H2aevnpuygU-23Neg87=bVX zVFbbmgb@fM5JuqtI0AoZJ9sN~<&Q0?Cz^kAT&dKj7u{&>h18WFwOse2Qakw!(SNSp z_f>+nLyGN5`o1R(D^KozW%TNekEE{tHg)Btl?#)}?#1q(q^=G8lnSWrt&rtkr>(X_ zpYqBh{)@z@a0}>3EiSkJuF(+12r$ zwjB?*EU44_A9%-!!`^2@_UC$^h8^WOahWb1^VE(uCX%~ik41-eZXKbDSq@VefiMDL z1i}b}5eOp?Mj(tp7=bVXVFbbmY={8XD`I^j)*gBN7>E3*8oEMmmk#94mnq-55#Dzzl~I}EKJ7u+G(A-Go%fVGi} zvi@>GjmRz7@Hizl)4^ zN%8+Z!20n2utcm&Jv%h?K>Wz1scONk#=E<%UaPCKyXuMEkM{IfUA;$zzI}x}uC}Px zYC$WGcZ4*bk$}X-;7-Cu_S_#)wM&&`Jc_xB3;&e>e?oYSZ`hAgCZal2EMXXodtPN7 zq5oQ7yc(@iAEOM{i~9vUkHd(%Q(^pr|2kzFwf|e5eN1hM8%r4$YDxGO;nAMgh2I|F z_mDwE#nc@EzF+tq0e-W1e!#PDS3eee zfq$C#M(fVMLwp=YK3w+reM%*KBxP?9A5;74{Rr(6@$Jzzh36Fb7sWnU&L6z;VYQC8 zh~FLEr*J<&vn|S3OM@+L81&;^#K&k{btGVE@FgmzoyJc>#;5ncFj5^5dyGSPy`6Zr zKPt~z?|)pRJjV4>dxG};#K+<6!wKT=^~uQQiEoe6(=%|tsEg^c+iewT1-(6$)vi6G zh^V;L>1ivi)>qqWH?PyY-o8SXnWCP_6{qZ+&bY;LMcdUml`iH>ImdM}R##&SUi+Wb zcDZcNYp39r=hbxC&O16&&FAOI#V2X9bT^pNg8x#ll`fT({?Pa-TJ2w`(td)uv7T;f zjWcambFR)6(;wBPVlJDWPqJB`)}@M@JLSwd>8hJ87J4pskDaJE58Xyvvdf!mPmxwv z3%4!dB=mY@V(?s2C&!01?ME2?;P~LV(IL7_+Ss9!Dbc2eCzL)rcK*!Zm_9!;axpon zCkM}rCCMYWKO%u$5pT2;!pYdKt-NS+N04B)MUb#@kA%)tih9;AWO)C?=y|frWDB}l zaWaZJh)#N{QW0NohlbX)=K@#6n=u;hu-LfKquy-Z%;EJbZEdQ|=Usb>&@CIBMJ`*Q zogF1*6^gE7Q72oaa6s@i&9kcpy)O z+xcvon!_DqQBajdcT1jb0^FT%9(n#nkDB`b@Pqs5F#kdgZ0k>NC4uKi^my>nX8XoO zU7yE6?xT#~Ke&JFFboCp+yu?P%YJ{%3xIJL3I_e(PyFjN$3putuLPog%quakL$Nkx zcuom_%sYWkiXpd=V+ViC7qi6iR0jT-#{zl2;7`H$KSWBNL&6{PMj+44-A4oA?UC1+jnGU~y zT>O9{)?FY2p9%PPi2?{a6aX3cjevhb6u?zD3c?SxncuBnKjt4myg$J{IDWrN3ch~C zU&X~z5dAOgzs2tdr11Nel_Z!TMvEMRi z4;lD7^5wY>{4oz-?Ie;C?2NQ7gMXD2JoeyUpQp_|`q=Z?CZxbcX&B$f`{+P>@ci3O9NO-4Hy?Y6s00c}y|Cr!ZX^E+|FBSM4LAfu F^)Ihi-KGEl literal 0 HcmV?d00001 diff --git a/82.-Remove-Duplicates-from-Sorted-List-II/memo.md b/82.-Remove-Duplicates-from-Sorted-List-II/memo.md new file mode 100644 index 0000000..0ad1584 --- /dev/null +++ b/82.-Remove-Duplicates-from-Sorted-List-II/memo.md @@ -0,0 +1,21 @@ +# step1 +83と同様に、確定しているノードの次のノードの状態で場合分けして考える + +tailまで確定しているとして(最初の場合分けも必要か?)、 +- tail.next == nullptr +- tail.next が採用できる=値が連続していない +- tail.next が採用できない=tail.nextから値が連続している + +が考えられる。番兵をおけば最初を場合分けなくて済む。 + +→ややこしくなってしまいとりあえず値のカウントリストを用意して解いた。 +# step2 +新井さんの解答ではやはり重複中を走るポインタをもう一つ用意していたのでそうすればすっきり実装できそう。 + +→discordを見て削除は値で行うことに変更。 + +小田さんの電車の振り分けの比喩で考えると、各日付の作業者は各日付のうちに重複を取り除くことにしtailを引き継ぎのない重複のない状態にして次の人に引き継ぐということ。 + + +# step3 +一重目のwhileで注目しているノードをcur_nodeで置いたけどあんまりわかりやすくなっていない? diff --git a/82.-Remove-Duplicates-from-Sorted-List-II/step1.cpp b/82.-Remove-Duplicates-from-Sorted-List-II/step1.cpp new file mode 100644 index 0000000..2f9afd5 --- /dev/null +++ b/82.-Remove-Duplicates-from-Sorted-List-II/step1.cpp @@ -0,0 +1,32 @@ +#include +struct ListNode { + int val; + ListNode* next; + ListNode() : val(0), next(nullptr) {} + ListNode(int x) : val(x), next(nullptr) {} + ListNode(int x, ListNode* next) : val(x), next(next) {} +}; + +class Solution { + public: + ListNode* deleteDuplicates(ListNode* head) { + // 値の登場回数を管理する + std::map count; + for (ListNode* p = head; p != nullptr; p = p->next) { + count[p->val]++; + } + ListNode* dummy = new ListNode(0); + dummy->next = head; + ListNode* tail = dummy; + while (tail != nullptr && tail->next != nullptr) { + if (count[tail->next->val] > 1) { + tail->next = tail->next->next; + } else { + tail = tail->next; + } + } + ListNode* ans = dummy->next; + delete dummy; + return ans; + } +}; diff --git a/82.-Remove-Duplicates-from-Sorted-List-II/step2.cpp b/82.-Remove-Duplicates-from-Sorted-List-II/step2.cpp new file mode 100644 index 0000000..e8fd160 --- /dev/null +++ b/82.-Remove-Duplicates-from-Sorted-List-II/step2.cpp @@ -0,0 +1,31 @@ +struct ListNode { + int val; + ListNode* next; + ListNode() : val(0), next(nullptr) {} + ListNode(int x) : val(x), next(nullptr) {} + ListNode(int x, ListNode* next) : val(x), next(next) {} +}; + +class Solution { + public: + ListNode* deleteDuplicates(ListNode* head) { + // スタック上に動的確保することで開放しなくてよくなる + ListNode dummy(0, head); + ListNode* tail = &dummy; + // tailまでは重複がないとして次のノードから確認する + while (tail->next && tail->next->next) { + if (tail->next->val != tail->next->next->val) { + tail = tail->next; + } else { + // 重複を検知した場合、値が被っている間ノードを消していく + int val_to_remove = tail->next->val; + while (tail->next && tail->next->val == val_to_remove) { + ListNode* toDelete = tail->next; + tail->next = tail->next->next; + delete toDelete; + } + } + } + return dummy.next; + } +}; diff --git a/82.-Remove-Duplicates-from-Sorted-List-II/step3.cpp b/82.-Remove-Duplicates-from-Sorted-List-II/step3.cpp new file mode 100644 index 0000000..ef257c9 --- /dev/null +++ b/82.-Remove-Duplicates-from-Sorted-List-II/step3.cpp @@ -0,0 +1,30 @@ +struct ListNode { + int val; + ListNode* next; + ListNode() : val(0), next(nullptr) {} + ListNode(int x) : val(x), next(nullptr) {} + ListNode(int x, ListNode* next) : val(x), next(next) {} +}; + +class Solution { + public: + ListNode* deleteDuplicates(ListNode* head) { + ListNode dummy(0, head); + ListNode* tail = &dummy; + while (tail->next && tail->next->next) { + ListNode* cur_node = tail->next; + if (cur_node->val != cur_node->next->val) { + tail = cur_node; + continue; + } + int val_to_remove = cur_node->val; + while (cur_node && cur_node->val == val_to_remove) { + ListNode* to_delete = cur_node; + cur_node = cur_node->next; + delete to_delete; + } + tail->next = cur_node; + } + return dummy.next; + } +}; diff --git a/82.-Remove-Duplicates-from-Sorted-List-II/step3_2.cpp b/82.-Remove-Duplicates-from-Sorted-List-II/step3_2.cpp new file mode 100644 index 0000000..fdc8aa1 --- /dev/null +++ b/82.-Remove-Duplicates-from-Sorted-List-II/step3_2.cpp @@ -0,0 +1,31 @@ +struct ListNode { + int val; + ListNode* next; + ListNode() : val(0), next(nullptr) {} + ListNode(int x) : val(x), next(nullptr) {} + ListNode(int x, ListNode* next) : val(x), next(next) {} +}; + +class Solution { + public: + ListNode* deleteDuplicates(ListNode* head) { + ListNode dummy(-1, head); + ListNode* last_non_duplicate_node = &dummy; + ListNode* cur_node = last_non_duplicate_node->next; + while (cur_node && cur_node->next) { + if (cur_node->val != cur_node->next->val) { + last_non_duplicate_node = cur_node; + cur_node = cur_node->next; + continue; + } + int val_to_remove = cur_node->val; + while (cur_node && cur_node->val == val_to_remove) { + ListNode* to_delete = cur_node; + cur_node = cur_node->next; + delete to_delete; + } + last_non_duplicate_node->next = cur_node; + } + return dummy.next; + } +}; diff --git a/82.-Remove-Duplicates-from-Sorted-List-II/step4.cpp b/82.-Remove-Duplicates-from-Sorted-List-II/step4.cpp new file mode 100644 index 0000000..d4cf4ca --- /dev/null +++ b/82.-Remove-Duplicates-from-Sorted-List-II/step4.cpp @@ -0,0 +1,30 @@ +#include + +struct ListNode { + int val; + std::unique_ptr next; + ListNode() : val(0), next(nullptr) {} + ListNode(int x) : val(x), next(nullptr) {} + ListNode(int x, std::unique_ptr next) : val(x), next(std::move(next)) {} +}; + +class Solution { + public: + std::unique_ptr removeDuplicate(std::unique_ptr head) { + std::unique_ptr dummy = std::make_unique(0); + dummy->next = std::move(head); + std::unique_ptr* tail = &dummy->next; + + while (*tail && (*tail)->next) { + if ((*tail)->val != (*tail)->next->val) { + tail = &(*tail)->next; + } else { + int val_to_remove = (*tail)->val; + while (*tail && (*tail)->val == val_to_remove) { + *tail = std::move((*tail)->next); // 外れたノードは自動で delete + } + } + } + return std::move(dummy->next); + } +}; diff --git a/82.-Remove-Duplicates-from-Sorted-List-II/test.cpp b/82.-Remove-Duplicates-from-Sorted-List-II/test.cpp new file mode 100644 index 0000000..3d295e8 --- /dev/null +++ b/82.-Remove-Duplicates-from-Sorted-List-II/test.cpp @@ -0,0 +1,15 @@ +// ポインタと参照の違い + +#include +void func(int& x) { + x += 10; + printf("%p\n", &x); +} +int main() { + int b = 10; + int& c = b; + std::cout << c << std::endl; // 10 + printf("%p\n", &b); + func(b); // bは20になる + std::cout << b << std::endl; +}