今日のトピックはLeetCodeが148個の質問を磨くあり、中難易度
これは、ケース時間複雑性O(nlogn)の中でソートされたリストの空間的な複雑さの被写体を一定のレベルを必要としています
一般的に、データはO(N2)、およびクイックソートは挿入ソートと選択、バブリング、されているソートとソート時間の複雑さをマージすることはO(nlogn)です。したがって、このアルゴリズムはマージソートやクイックソートと考えることができます
一般的なソートアルゴリズムはO(N)スペースの複雑さを必要とする場合。上記のアルゴリズムの改良のためにそのための必要性
この記事では、選択したマージソートアルゴリズムの一覧です。アルゴリズムは、分割したデータをマージする必要があります。セグメンテーションがある場合には、二ポインタ戦略を採用します。
その後、操作をマージします。マージ操作は、ノードリストの値を比較することです。最後に、合併後のリストに戻ります。具体的なコードは次のよう:
パブリック クラスsortlistが{ 公共 静的 ボイドメイン(文字列[]引数){ INT [] = { - 5、-10、-2,1,0,10,12,9,4 }。 ListNodeヘッド = ListNode.generateListNode(A)。 ヘッド = SortList.sort(ヘッド) 一方、(ヘッド!= NULL ){ のSystem.out.println(head.val)。 ヘッド = head.next。 } } パブリック 静的ListNodeソート(ListNodeヘッド){ 戻りヘッド== NULL?ヌル:SortList.mergeSort(頭); } パブリック 静的ListNodeのマージ(ListNodeヘッド){ // 境界条件 IF(head.next == NULL)戻りヘッド; //は、二重のポインタを定義し、2つの部分にリンクされたリストは、 = FAST ListNode ヘッド; ListNode SLOW = ヘッド; ListNode予備 = NULL ; ながら(!= FAST ヌル!&& fast.next = NULL ){ プリ = SLOW、 FAST = fast.next.next; SLOW =slow.next; } pre.next = NULL ; ListNodeは左 = ヘッドと、 右ListNode = 遅いです。 ListNodeさL = マージ(左)。 ListNode R = マージ(右)。 戻りマージ(L、R)。 } パブリック 静的ListNodeマージ{(ListNodeは、ListNodeが左右) ListNode結果 = 新しい ListNode(0 )。 ListNode電流 = 結果。 しばらく(左!= nullの &&右!= nullを){ 場合(left.val < right.val){ current.next = 左。 現在 = current.next。 左 = left.next。 } そう であれば(left.val> = {right.val) current.next = 右。 右 = right.next。 現在 = current.next。 } であれば(左!= NULL ){ current.next = 左。 } 場合(右!= NULL ){ current.next = 右。 } } 戻りresult.next。 } }