プロが教える店舗&オフィスのセキュリティ対策術

```c
1truct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
2 if (!list2){
3 return list1;
4 }
5
6 if (!list1){
7 return list2;
8 }
9
10 struct ListNode *temp;
11
12 if (list1->val <= list2->val){
13 temp = list1;
14 temp->next = mergeTwoLists(list1->next, list2);
15 }else{
16 temp = list2;
17 temp->next = mergeTwoLists(list2->next, list1);
18 }
19
20 return temp;
21}
22
```


この2行目から8行目までにif判断式は何を表しているんですか?なぜlist1,2を返しているんですか?返す意味はなんですか?
またどういう流れでコードが進んでいきますか?
※このコードは自分で書いたわけではありません。

A 回答 (2件)

まずは2つの配列をマージして一本の配列にまとめるのを


学ぶのが良いと思う。

「マージのアルゴリズム」
https://programming-place.net/ppp/contents/algor …
これの「2ウェイマージ」をよく理解した上で
リンクトリスト版や再起版でどうなるか考えた方が良いと思う。
    • good
    • 0

再帰だから2つの関連した意味が有って



①2つのソートされたリストをマージする際
片方のリストが空なら、ソートは不要なので空でない方のリストを返せば良い
ということ。両方とも空ならNULLを返すしかない。

②再帰でマージを進めてゆくと、マージすべき2本のソートされた
リストがだんだん短くなって行く。
やがて①の条件に達すると再帰が終了し、再帰を
遡って処理全体が終了する。
つまり①は再帰の終了条件になっている。

前にも少し書いたけど、再帰は美しくシンプルに書けるけど
プログラミングの初心者には難解。
またこのコードはスタックを食いまくるので簡単に
スタックオーバーフローで停止してしまい
実用性は無い。

学習にはもっと良いコードを見つけるべき。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!