From 9aaebe0cfaa1a0d3d67cab1faa2624278f97ab8f Mon Sep 17 00:00:00 2001 From: rihib Date: Sat, 22 Jun 2024 13:56:57 +0900 Subject: [PATCH 1/6] for_review: Merge Two Sorted Lists --- pullrequests/merge_two_sorted_lists/step1.go | 60 ++++++++++++++++ pullrequests/merge_two_sorted_lists/step2.go | 30 ++++++++ pullrequests/merge_two_sorted_lists/step3.go | 73 ++++++++++++++++++++ 3 files changed, 163 insertions(+) create mode 100644 pullrequests/merge_two_sorted_lists/step1.go create mode 100644 pullrequests/merge_two_sorted_lists/step2.go create mode 100644 pullrequests/merge_two_sorted_lists/step3.go diff --git a/pullrequests/merge_two_sorted_lists/step1.go b/pullrequests/merge_two_sorted_lists/step1.go new file mode 100644 index 0000000..8dac4a4 --- /dev/null +++ b/pullrequests/merge_two_sorted_lists/step1.go @@ -0,0 +1,60 @@ +//lint:file-ignore U1000 Ignore all unused code +package mergetwosortedlists + +/* + 個人的にLeetCodeを進めていて、2月ごろに解いたもの。GitHubのコミット履歴から引っ張ってきま + した。 + + 解いた時間を記録していなかったのですが、恐らく20~30分ぐらいかかった気がします。解いている途 + 中でポインタの向きがよくわからなくなってしまい、時間がかかってしまった記憶があります。また、 + Goの勉強も兼ねて書いたので、言語自体の知識も少ない状態で書きました。 + + 綺麗に書いている余裕がなかったので、とりあえず動くコードを書いたという感じです。とりあえず値 + の小さいノードから順番にポインタの向きを変えてマージしていけば良いとはわかったのですが、実装 + 力に余裕がなく、コードが冗長になってしまったという印象です。 +*/ + +type ListNode struct { + Val int + Next *ListNode +} + +func mergeTwoLists_step1(list1 *ListNode, list2 *ListNode) *ListNode { + if list1 == nil { + return list2 + } + if list2 == nil { + return list1 + } + + var res *ListNode + if list1.Val <= list2.Val { + res = list1 + list1 = list1.Next + } else { + res = list2 + list2 = list2.Next + } + + curNode := res + for { + if list1 == nil { + curNode.Next = list2 + return res + } + if list2 == nil { + curNode.Next = list1 + return res + } + + if list1.Val <= list2.Val { + curNode.Next = list1 + curNode = curNode.Next + list1 = list1.Next + } else { + curNode.Next = list2 + curNode = curNode.Next + list2 = list2.Next + } + } +} diff --git a/pullrequests/merge_two_sorted_lists/step2.go b/pullrequests/merge_two_sorted_lists/step2.go new file mode 100644 index 0000000..ea5a58c --- /dev/null +++ b/pullrequests/merge_two_sorted_lists/step2.go @@ -0,0 +1,30 @@ +//lint:file-ignore U1000 Ignore all unused code +package mergetwosortedlists + +/* + 他の人のコードを色々見て、冗長な部分を消し、リファクタをしました。 +*/ + +func mergeTwoLists_step2(list1 *ListNode, list2 *ListNode) *ListNode { + dummy := new(ListNode) + cur := dummy + + for list1 != nil && list2 != nil { + if list1.Val <= list2.Val { + cur.Next = list1 + list1 = list1.Next + } else { + cur.Next = list2 + list2 = list2.Next + } + cur = cur.Next + } + + if list1 != nil { + cur.Next = list1 + } else { + cur.Next = list2 + } + + return dummy.Next +} diff --git a/pullrequests/merge_two_sorted_lists/step3.go b/pullrequests/merge_two_sorted_lists/step3.go new file mode 100644 index 0000000..8dfaac0 --- /dev/null +++ b/pullrequests/merge_two_sorted_lists/step3.go @@ -0,0 +1,73 @@ +//lint:file-ignore U1000 Ignore all unused code +package mergetwosortedlists + +/* + 感想: + 現在(6月)解いたコードになります。大分余裕を持って書けるようになってきました。一番初めはポ + インタの向きがよくわからなくなるということがあったのですが、そういったこともなくなり、ポイ + ンタの操作を余裕を持って書けるようになってきました。暗記ではなく、自然と同じようなコードが + 出てくるようになりました。またGo自体も初期に比べて無理なく自然に書けるようになりました。 + + Step2に比べて変数名が改善されています(curではなくtailに変更)。また個人的にシンプルで見 + やすいと思っているので多重代入をよく使うようになりました。 + + また、個人的な感覚として、list1またはlist2のどちらか片方がnilの場合の処理をfor文の中に入 + れるか、外に出すかをその時の気分で意図的に変えるようになりました。 + + 質問したいこと: + - tailという変数名についてどう思いますか? + - 多重代入は使った方がシンプルで見やすいと個人的に思ってるのですがどう思いますか?もちろん + 互いに影響を与え合ってしまうような変数同士の場合は挙動がundefinedだと思うので避けるべき + だとは思いますが。 + - 個人的には上と下の回答はどちらも大差ないと思っていてどちらでも良いと思っているのですが、 + どう思いますか? +*/ + +func mergeTwoLists_step3(list1 *ListNode, list2 *ListNode) *ListNode { + dummy := new(ListNode) + tail := dummy + + for list1 != nil && list2 != nil { + if list1.Val < list2.Val { + tail.Next, list1 = list1, list1.Next + } else { + tail.Next, list2 = list2, list2.Next + } + tail = tail.Next + } + + if list1 != nil { + tail.Next = list1 + } + if list2 != nil { + tail.Next = list2 + } + + return dummy.Next +} + +func mergeTwoLists_step3_anothersolution(list1 *ListNode, list2 *ListNode) *ListNode { + dummy := new(ListNode) + tail := dummy + + for list1 != nil || list2 != nil { + if list1 == nil { + tail.Next = list2 + break + } + if list2 == nil { + tail.Next = list1 + break + } + + if list1.Val < list2.Val { + tail.Next, list1 = list1, list1.Next + } else { + tail.Next, list2 = list2, list2.Next + } + tail = tail.Next + tail.Next = nil + } + + return dummy.Next +} From ddb9464c35fd1248d0bef36ae476d35724b7809f Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 23 Jun 2024 13:41:55 +0900 Subject: [PATCH 2/6] refactor Reverse Linked List --- go/reverse_linked_list.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/go/reverse_linked_list.go b/go/reverse_linked_list.go index d31ca47..0a094c5 100644 --- a/go/reverse_linked_list.go +++ b/go/reverse_linked_list.go @@ -3,13 +3,9 @@ package main func reverseList_iterative(head *ListNode) *ListNode { var prev *ListNode - for head != nil { - next := head.Next - head.Next = prev - prev, head = head, next + prev, head, head.Next = head, head.Next, prev } - return prev } From db36382cae819196e3d5ae07df40160313d00c43 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 23 Jun 2024 14:23:13 +0900 Subject: [PATCH 3/6] refactor Reverse Linked List --- go/reverse_linked_list.go | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/go/reverse_linked_list.go b/go/reverse_linked_list.go index 0a094c5..69e2142 100644 --- a/go/reverse_linked_list.go +++ b/go/reverse_linked_list.go @@ -9,14 +9,13 @@ func reverseList_iterative(head *ListNode) *ListNode { return prev } -func reverseList_recursive(head *ListNode) *ListNode { - // Test Case: [], [1], [1, 2], [1, 2, 3], [1, 2, 3, 4] +func reverseList_recurssive(head *ListNode) *ListNode { if head == nil || head.Next == nil { return head } next := head.Next - reversedListHead := reverseList_recursive(next) - next.Next, head.Next = head, nil - return reversedListHead + reversedHead := reverseList(next) + head.Next, next.Next = nil, head + return reversedHead } From f9a60185da4e869e000d39cd4f2d5b7b71911167 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 23 Jun 2024 14:23:36 +0900 Subject: [PATCH 4/6] fix typo --- go/reverse_linked_list.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/reverse_linked_list.go b/go/reverse_linked_list.go index 69e2142..31850e2 100644 --- a/go/reverse_linked_list.go +++ b/go/reverse_linked_list.go @@ -15,7 +15,7 @@ func reverseList_recurssive(head *ListNode) *ListNode { } next := head.Next - reversedHead := reverseList(next) + reversedHead := reverseList_recurssive(next) head.Next, next.Next = nil, head return reversedHead } From 7c5b757d2d7acbaa6636cfeee63a95bfd4df8561 Mon Sep 17 00:00:00 2001 From: rihib Date: Sun, 23 Jun 2024 15:00:06 +0900 Subject: [PATCH 5/6] revert changes --- go/reverse_linked_list.go | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/go/reverse_linked_list.go b/go/reverse_linked_list.go index 31850e2..d31ca47 100644 --- a/go/reverse_linked_list.go +++ b/go/reverse_linked_list.go @@ -3,19 +3,24 @@ package main func reverseList_iterative(head *ListNode) *ListNode { var prev *ListNode + for head != nil { - prev, head, head.Next = head, head.Next, prev + next := head.Next + head.Next = prev + prev, head = head, next } + return prev } -func reverseList_recurssive(head *ListNode) *ListNode { +func reverseList_recursive(head *ListNode) *ListNode { + // Test Case: [], [1], [1, 2], [1, 2, 3], [1, 2, 3, 4] if head == nil || head.Next == nil { return head } next := head.Next - reversedHead := reverseList_recurssive(next) - head.Next, next.Next = nil, head - return reversedHead + reversedListHead := reverseList_recursive(next) + next.Next, head.Next = head, nil + return reversedListHead } From 3e23ed4a8b793cf7f342f684439959a37fe8f78d Mon Sep 17 00:00:00 2001 From: rihib Date: Mon, 12 Aug 2024 16:10:22 +0900 Subject: [PATCH 6/6] add step4 for Merge Two Sorted Lists --- pullrequests/merge_two_sorted_lists/step4.go | 22 ++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 pullrequests/merge_two_sorted_lists/step4.go diff --git a/pullrequests/merge_two_sorted_lists/step4.go b/pullrequests/merge_two_sorted_lists/step4.go new file mode 100644 index 0000000..88f9858 --- /dev/null +++ b/pullrequests/merge_two_sorted_lists/step4.go @@ -0,0 +1,22 @@ +//lint:file-ignore U1000 Ignore all unused code +package mergetwosortedlists + +func mergeTwoLists_step4(list1 *ListNode, list2 *ListNode) *ListNode { + dummy := new(ListNode) + tail := dummy + for list1 != nil && list2 != nil { + if list1.Val < list2.Val { + tail.Next, list1 = list1, list1.Next + } else { + tail.Next, list2 = list2, list2.Next + } + tail = tail.Next + } + if list1 != nil { + tail.Next = list1 + } + if list2 != nil { + tail.Next = list2 + } + return dummy.Next +}