質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1827閲覧

C++で2つのリンクリストを、数値の大きさ順に1つにまとめたい

edoooooo

総合スコア478

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/06/20 19:46

編集2020/06/21 03:46

期待されているような、連結したリストが出力されません。

input l1[1,2,4] l2[1,3,4] output "Time Limit Exceeded expected [1,1,2,3,4,4]

###定義

C++

1/** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 7 * ListNode() : val(0), next(nullptr) {} 8 * ListNode(int x) : val(x), next(nullptr) {} 9 * ListNode(int x, ListNode *next) : val(x), next(next) {} 10 * }; 11 */

###私の問題を含んだ回答

C++

1 2 ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { 3 //2つの並べ替えられたリンクリストを、新しい並べ替えられたリストとして返します。 4 ListNode *nodePtr=new ListNode; 5 while(l2!=NULL || l1!=NULL) 6 { 7 if(l1==NULL){ 8 nodePtr=l2; 9 l2=l2->next; 10 }else if(l2==NULL){ 11 nodePtr=l1; 12 l1=l1->next; 13 }else{ 14 //リスト1の要素よりもリスト2の要素が小さい場合は、リスト2の要素を先にリスト3に代入 15 if(l1->val <= l2->val){ 16 //l1の値の方が小さいので、nodePtrはl1に連結させる 17 nodePtr=l1; 18 //リスト1を次の要素に進める 19 l1=l1->next; 20 }else{ 21 nodePtr=l1; 22 l2=l2->next; 23 } 24 } 25 nodePtr->next=nodePtr; 26 } 27 return nodePtr; 28 }

###下記の模範解答も参考したのですが、私のコードとの違いがわかりません。
模範回答

C++

1 ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { 2 3 ListNode *nodePtr; 4 if(l1==NULL){ 5 return l2; 6 } else if(l2==NULL){ 7 return l1; 8 } 9 10 if(l1->val<=l2->val){ 11 nodePtr=l1; 12 nodePtr->next=mergeTwoLists(l1->next,l2); 13 } else{ 14 nodePtr=l2; 15 nodePtr->next=mergeTwoLists(l1,l2->next); 16 } 17 18 return nodePtr; 19 } 20};

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

e-watt

2020/06/21 01:24

質問が不明なので感想を書きますが、 ループの序盤でl1とl2の片方だけがNULLだったら、 num1やnum2の値はどうするんだろうと気になりました。
edoooooo

2020/06/21 02:18

感想をいただいた点を修正しました。もし引き続きアドバイスをいただけたらよろしくお願いします。
hope_mucci

2020/06/21 02:51

このリンクリストは循環されていないのが保証されているのでしょうか?
edoooooo

2020/06/21 03:09

すみません。循環するということがどのようなことかわかりませんでした。
edoooooo

2020/06/21 03:11

模範回答の中で、循環していないことを証明するようなコードはないように思ったのですが、どうでしょうか
edoooooo

2020/06/21 03:16

LeetCodeというプログラミング問題サイトで実行してるのですが、その開発環境によるエラーなのでしょうか?
hope_mucci

2020/06/21 03:27

リストの循環とは、ここでいうnextにリストの先頭アドレスが入るノードがあると終端がなくなりずっとぐるぐる回る状態を指します。まあ「ソートされている」と書かれているから循環していないと考えられます。
edoooooo

2020/06/21 03:29

ありがとうございます。 この問題に使われている2つのリストは、 l1 [1,2,4] l2 [1,3,4] なので、循環はしていませんでした。
guest

回答2

0

ベストアンサー

ループで実現する場合は、先頭のノードと現在のノードのポインタを使用する必要があります。
nodePtrで連結対象のポインタをl1かl2に決定する方法は問題ないと思います。
nodePtrを決定した後に、先頭のノードと現在のノードのポインタの設定と返却をするようにすれば、今回の処理で動作します。

C++

1 ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { 2 3 //2つの並べ替えられたリンクリストを、新しい並べ替えられたリストとして返します。 4 ListNode *rootPtr=NULL; //★先頭のノードを保持する 5 ListNode *currentPtr; //★現在のノードを保持する 6 ListNode *nodePtr; //★l1かl2のどちらかを一時的に保持する 7 8 while(l2!=NULL || l1!=NULL) 9 { 10 //★この処理は不要 11 //if(nodePtr!=NULL){ 12 // nodePtr=nodePtr->next; 13 //} 14 15 //★nodePtrにl1かl2の連結したい側を設定(ここは修正なし) 16 if(l1==NULL){ 17 nodePtr=l2; 18 l2=l2->next; 19 20 }else if(l2==NULL){ 21 nodePtr=l1; 22 l1=l1->next; 23 24 }else{ 25 //リスト1の要素よりもリスト2の要素が小さい場合は、リスト2の要素を先にリスト3に代入 26 if(l1->val <= l2->val){ 27 //l1の値の方が小さいので、nodePtrはl1に連結させる 28 nodePtr=l1; 29 //リスト1を次の要素に進める 30 l1=l1->next; 31 32 }else{ 33 nodePtr=l2; 34 l2=l2->next; 35 } 36 37 } 38 //★先頭のノードが未設定なら設定 39 if(rootPtr == NULL){ 40 rootPtr=nodePtr; 41 } 42 //★現在のノードの次に連結する 43 else{ 44 currentPtr->next=nodePtr; 45 } 46 //★現在のノードを次に移動する 47 currentPtr=nodePtr; 48 } 49 //★先頭のノードを返却する 50 return rootPtr; 51 //return nodePtr; 52 }

投稿2020/06/21 04:51

etsuhisa

総合スコア416

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

edoooooo

2020/06/21 08:33

ありがとうございました。 無事動きました。 rootPtrと、currentPtrがどのようにリンクしたのかを理解するには知識不足だったため、何度もコードを読み返したのですが、完璧に理解することはできませんでした。これからいろいろな練習問題をときながら学んでいこうと思います。 お世話になりました。
guest

0

LeetCodeというプログラミング問題サイトで実行してるのですが、その開発環境によるエラーなのでしょうか?

まずは自分の腕を疑いましょう。自分が間違ったからエラーが出る。デバッグの鉄則。

で、どこが間違っているでしょうか。書いたコードを先頭からよく見てみてください。

冒頭のnodePtrはポインタ変数ですね?構造体としての実体はないですね。
どこにもnodePtrの中身を確保しているコードはないですね。
それなのにnodePtrの中身に値を入れようとしていますね。これが質問文のエラーです。

つまり最初のnodePtrに何かしらの実体を入れてやればよいです。新しく構造体を確保しても良し、l1かl2でも良し。

ここが解決してもまた次の不具合が出ると思います。怪しい部分の途中経過を出力しながら根気よく間違っている部分を探しましょう。

投稿2020/06/21 03:34

hope_mucci

総合スコア4447

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

edoooooo

2020/06/21 03:47

ありがとうございます。 まずは自分の腕を疑うようにします。 ListNode *nodePtr=new ListNode; というコードに変更し、エラーは変更されました。
hope_mucci

2020/06/21 05:20

問題が解消されたからと言って、次に発生した問題で前の問題を上書きしないでください。 回答と質問が一致しなくなります。 履歴として質問本文に残しておくか、新しい問題は別の質問を立てましょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問