説明
そして、複雑さの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と、 } }