(再帰と反復)2つの命じたリストをマージ

2つの注文したリストをマージ

概要:

  2は、新たなソートされたリストとリターンにリストを命じました。新しいリストは、二つのリストで構成与えられたモザイク内のすべてのノードです。例:入力: 1-> 2-> 4、1-> 3-> 4 出力: 1-> 1-> 2-> 3-> 4-> 4

方法の一つ:再帰

2つのリンクリストに再帰的に定義されたmerge操作:

  LIST1 [0] +マージ(LIST1 [1]、LIST2)LIST1 [0] <LIST2 [0]

  LIST2 [0] +マージ(LIST1、LIST2 [1])、さもなければ

再帰:分析l1l2小さくなっている最初の要素は、次いで、再帰的に付加価値をもたらすことを決定しました。二つのリストが空である場合には、処理を終了するには、その再帰的なプロセスは、最終的に終了します。

クラスソリューション:
    デフmergeTwoLists(自己、L1、L2):
        L1はNoneです場合:
            リターンL2
        elifのL2はNoneです。
            リターンL1
        elifのl1.val <l2.val:
            l1.next = self.mergeTwoLists(l1.next、L2)
            リターンL1
        他:
            l2.next = self.mergeTwoLists(L1、l2.next)
            リターンL2
  • 時間計算量:O(N + M)。再帰は、L1またはL2の最初の要素を削除するので、(少なくとも一つのリストが空になるまで)、一度だけ、各コールの各要素を介して機能mergeTwoList。したがって、線形関係と組み合わさ時間計算後のリストの長さ。
  • 空間複雑:O(N + M)。各要素は横断されている必要がありmergeTwoLists出口L1およびL2を呼び出すとき、M消費スタックフレームN +そうスペースO(N + M)です。

方法2:反復

クラスソリューション:
    デフmergeTwoLists(自己、L1、L2):
        #リターンノードのノード先への不変の参照を維持します。
        prehead = ListNode(-1)

        PREV = prehead
        L1とL2中:
            l1.val <= l2.valの場合:
                prev.next = L1
                L1 = l1.next
            他:
                prev.next = L2
                L2 = l2.next            
            PREV = prev.next

        #正確に一つのL1とL2のは、この時点で非nullになることができ、接続ので、
        #マージされたリストの最後にnull以外のリスト。
        prev.next = L1 L1はなし他のL2でない場合

        リターンprehead.next
  • 時間計算量:O(N + M)。回数がリストの2つのサイクルの長さの合計に等しいしながら各ループ反復ので、唯一の要素L1、L2が、リストにマージされます。合計時間の複雑さが線形であるので、他のすべての作業は、一定のレベルです。
  • 複雑スペース:O(1)。反復プロセスは、いくつかのポインタが生成されますので、それが必要とするスペースが一定のレベルです。

 

 

 

おすすめ

転載: www.cnblogs.com/yinminbo/p/11880676.html
おすすめ