タイトル
2つのソートされたリンクのリストをマージして、新しいリストとしてそれを返します。新しいリストは、最初の2つのリストのノードを一緒にスプライスすることでなされるべきです。
例:
入力:1-> 2-> 4、1-> 3-> 4
出力:1-> 1-> 2-> 3-> 4-> 4
考え
思考:新しいリストを作成します
合併の結果を保存するために、新しいリストを確立します。リストの挿入を容易にするために、一時的なノードの定義は、そうでない場合は、すべての時間は、エンドノードの挿入にトラバース。
再帰:2を考えます
- 再帰終了条件:
リストが空であります - 再帰
- もしL1->ヴァル<= L2->次のVal、ノードL1 L1->次に、マージされたリストとL2と呼ぶことにします
- L1->ヴァル> L2-> valは、L2を覚えているだろう次のノードがある場合は、次のL1リストと合併> L2-
図1:二つのリスト
C ++
- 思考
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if(l1 == nullptr)
return l2;
if(l2 == nullptr)
return l1;
ListNode* result = new ListNode(0) ;
ListNode* temp = result;
while(l1 != nullptr && l2 != nullptr){
if(l1->val <= l2->val){
temp ->next = l1;
l1 = l1 -> next;
}
else{
temp -> next =l2;
l2 = l2 ->next;
}
temp = temp ->next;
}
if(l1 == nullptr)
temp -> next = l2;
else
temp -> next =l1;
return result -> next;
}
- アイデア2
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if(l1 == nullptr)
return l2;
if(l2 == nullptr)
return l1;
if(l1->val <= l2->val){
l1->next = mergeTwoLists(l1->next ,l2);
return l1;
}
else{
l2->next = mergeTwoLists(l2->next ,l1);
return l2;
}
}