[LeetCode] 148☆☆☆ソートされたリスト148ソートされたリストを(マージソート)

148ソートされたリスト

説明

そして、複雑さのOは、時間(N Nログ)によって一定の間隔を、リストをソートすると、次の複雑さ。

例1:

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

入力:-1-> 5-> 3-> 4-> 0
出力:> 5 -1-> 0-> 3-> 4-

解決

この複雑さは、高速行とマージを使用して考えることができます。しかし、空間の一定レベルの複雑さは、その配列、必要に応じて、一時的な配列、リンクリストは、それが直接の間に行くように、接続することができます。

コード

/ ** 
 重リンク用*定義リスト。
 *パブリッククラスListNode { 
 * INTヴァル; 
 * ListNode次に、
 * ListNode(INT X){X =ヴァル;} 
 *} 
 * / 
パブリック クラスsortlistが{ 

    公共ListNode sortlistが(ヘッドListNode ){
         戻りOptional.ofNullable(マージ(ヘッド))orElse(ヘッド);. 
    } 

    公共ListNodeマージ(ListNodeヘッド){
         IF(ヘッド== NULL || head.next == NULL){   // 再帰終了条件:すなわちリストは左ノードに分割された後に
            戻りヘッド; 
        } 
        ListNodeプレヘッド=;                     // 本明細書で使用される速度分割リンクリストへのポインタ 
        ListNode = SLOW ;ヘッド
        ListNode FAST = ヘッドと、
         一方(= FAST!ヌル && fast.next!= NULL ){ 
            プリ = SLOW、
            SLOW = slow.next; 
            FAST = fast.next.next; 
        } 
        pre.next = NULL ;               //はヘッダは、ノードテーブルの左半分の分割、事前尾後にpre.nextようFASTリスト.nextの元の終了については、リストの右側の部分を遅らせますヌル 
        左ListNode =(ヘッド)をマージ; // 左再帰分割部
        右= ListNodeは(SLOW)マージ; // 右半分の再帰的分割
        リターン mergeList(左、右);   // マージリスト
    } 

    // マージは、2つのリストを命じた
    公共ListNode mergeList(ListNode左、右ListNode){
         IFを(左== nullを返す右;
         IF(右== nullのリターンが左; 
        ListNodeヘッド = 新しい新しい ListNodeを(-1 ); 
        ListNode TEMPを = ヘッドと、
         しばらく!(左= nullの &&右=!ヌル){
             場合(left.val < right.val){ 
                temp.next = 左。 = left.next。
            } { 
                temp.next = 右。 = right.next。
            } 
            TEMP = temp.next。
        } 
        であれば(左!= NULL ){ 
            temp.next = 左。
        } 
        であれば(右!= NULL ){ 
            temp.next =右; 
        } 
        戻りhead.nextと、
    } 
}

 

おすすめ

転載: www.cnblogs.com/fanguangdexiaoyuer/p/11363652.html