blog

日刊リートコード(7):2つの順序付きリンクテーブルをマージする

2つの昇順連結テーブルを新しい昇順連結テーブルにマージして返します。新しいリンクされたテーブルは、与えられた2つのリンクされたテーブルのすべてのノードを接続することによって形成されます。 まず最初に、...

Feb 5, 2020 · 3 min. read
シェア

アルゴリズム逆転への道、1日3分。

前の記事コレクション

日刊リートコード先例集

コード倉庫

GitHub: github.com/...

Gitee: gitee.com/inwsy/LeetC...

問題: 2つの順序付き連結テーブルのマージ

問題ソース

2つの昇順連結テーブルを新しい昇順連結テーブルにマージして返します。新しいリンクテーブルは、与えられた2つのリンクテーブルのすべてのノードを連結することで形成されます。

入力:1>2->4, 1->3->4
出力:1>1->2->3->4->4

解決策:反復

まず第一に、チェーンテーブルのデータ構造を理解する必要があります。これが明確でない場合、この問題はまったくプレイできません。

私は、チェーンテーブルを定義するコードを最初に書きます:

public class ListNode {
 public int val;
 public ListNode next;
 public ListNode() {
 }
 public ListNode(int val) {
 "これ"”.val = val;
 }
 public ListNode (int val, ListNode next) {
 "これ"”.val = val;
 "これ"”.next = next;
 }
}

コードはとてもシンプルで、整数値を保持するデータ・フィールドを定義し、チェーン・テーブル上の別のノードを形成する別のListNodeへのポインタを定義します。

次にソートですが、私はそれがソートの2つの配列であれば、ほとんどの人が書き出すことができるはずだと信じて、実際には、ソートの連鎖リストと配列のソートは、肯定的な思考に似ているソートの直接のサイクルは、単純です。

アイデア単純なコードも単純ですが、私は単純に反復ソートを書いたコードを見てください:

// 激しい反復
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
 ListNode prehead = new ListNode(-1);
 ListNode prev = prehead;
 while (l1 != null && l2 != null) {
 if (l1.val < l2.val) {
 prev.next = l1;
 l1 = l1.next;
 } else {
 prev.next = l2;
 l2 = l2.next;
 }
 prev = prev.next;
 }
 prev.next = l1 == null ? l2 : l1;
 return prehead.next;
}

非常に単純ではありませんが、チェーンテーブルの2つのノードのサイズを判断し、ポイントへのポインタを変更し、ループ、2つのノードが終了するためのNULLになるまでループします。

ループが終了したときに、l1とl2の最大1つは非NULLになることに注意する必要があります。

解決策:再帰

良い習慣に付着し、答えを見るために質問を終えた後、アイデアの一般的な並べ替えは何も巧妙ではありませんが、書くために別の方法を見た、この書き込みは正直であるが、また少し書くために総会。

これは少し恥ずかしいですが、私はとても恥知らずですが、そう直接出て、再帰このように、通常は基本的な書かないように、突然、突然私が少し書いてみましょうか、かなり難しい。

//  
public ListNode mergeTwoLists_1(ListNode l1, ListNode l2) {
 if (l1 == null) return l2;
 else if (l2 == null) return l1;
 else if (l1.val < l2.val) {
 l1.next = mergeTwoLists(l1.next, l2);
 return l1;
 } else {
 l2.next = mergeTwoLists(l1, l2.next);
 return l2;
 }
}

再帰コードは非常にきれいに見えるし、きれいさの代償は、可読性が低下しています。

しかし、再び、再帰は、それが一般的でなくても、すべてのコーダーが精通している必要があります。

追記:また自分の欠点を見つけてしまいましたが、こうして毎日1つずつ欠点を補っていくのは、やはりいいものですね。

あなたのコードの注意は、エディターがオリジナルに忠実であるための最大の励みです:)
Read next

Hammy学習オペレーティング・システム - プロセス・スケジューリング

コンピュータシステムがマルチチャネルである場合、通常は複数のプロセスやスレッドが同時にCPUを奪い合います。CPUが1つしかない場合は、次に実行するプロセスを選択しなければなりません。この選択を行うOSの部分はスケジューラと呼ばれ、プログラムを変更するすべてのアルゴリズム的なスケジューリング・アルゴリズム...

Feb 5, 2020 · 7 min read