21. 2つのソートされたリンクリストをマージする2つのソートリストの[E]をマージ

タイトル

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:二つのリスト
![](https://i.loli.net/2019/05/22/5ce506510660213051.jpg)
図2:最初の再帰
![](https://i.loli.net/2019/05/22/5ce50666dbb1b64155.jpg)
図3:第二の再帰

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; 
        }
    }

パイソン

おすすめ

転載: www.cnblogs.com/Jessey-Ge/p/10993514.html