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])、さもなければ
再帰:分析l1
とl2
小さくなっている最初の要素は、次いで、再帰的に付加価値をもたらすことを決定しました。二つのリストが空である場合には、処理を終了するには、その再帰的なプロセスは、最終的に終了します。
クラスソリューション: デフ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)。反復プロセスは、いくつかのポインタが生成されますので、それが必要とするスペースが一定のレベルです。