Leetcode Note: Go - Merge Two Sorted Lists
Merge Two Sorted Lists - LeetCode
https://leetcode.com/problems/merge-two-sorted-lists/
- Go 言語で取り組んだメモ
所感
- 愚直に実装するなら 2つ のリストをマージしてから改めてソートすれば良さそう
- わざわざソート済みのリストが用意されているので、もっとよいソート方法がありそうだが
実装準備
type ListNode struct {
Val int
Next *ListNode
}
func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode {
return &ListNode{}
}
func main() {
list1 := ListNode{
Val: 0,
}
list2 := ListNode{
Val: 0,
}
fmt.Println(list1, list2)
p := mergeTwoLists(&list1, &list2)
fmt.Println(p)
}
- そもそも実装準備でミニマムな環境をどう実装していいかも分からず・・・
- ListNode に含まれる Next は、どう表現したら良いんだろう
- mergeTwoLists が main からどう呼ばれているのかイメージできず
回答
Golang Solution - LeetCode Discuss
https://leetcode.com/problems/merge-two-sorted-lists/discuss/1890300/Golang-Solution
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode {
var head ListNode
current := &head
for list1 != nil && list2 != nil {
if list1.Val < list2.Val {
current.Next = list1
list1 = list1.Next
} else {
current.Next = list2
list2 = list2.Next
}
// advance to next value
current = current.Next
}
if list1 != nil {
current.Next = list1
} else {
current.Next = list2
}
return head.Next
}
- current の ListNode を定義
- list1 と list2 として nil が設定されていないことをチェックしつつ、ループ
- ソート処理
- list1.Val と list2.Val を比較して、小さい値を current.Next にする
- current.Next を設定した list を次のステップにすすめるため list.Next を更新
- ループをすすめるため current.Next を更新
- ソート処理
- list1 が nil じゃなければ、ループのため current.Next を list1 にする
- list1 が nil なら、ループのため current.Next を list2 にする
- head.Next (== ¤t.Next) を return
たぶん再帰的な呼び出され方を想定している関数なので、その辺のイメージができていない課題感あり