C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++でリストを並べ替える


リストがあるとすると、一定のスペースの複雑さを使用してこれをO(n logn)時間でソートする必要があるため、リストが[4,2,1,3]の場合、[1,2,3、 4]

これを解決するには、次の手順に従います-

  • 2つのリストをソートされた順序でマージするメソッドを定義します。そのメソッドはmerge()であり、これは2つのリストl1とl2を取ります。

  • ソートリストメソッドは次のように機能します-

  • headがnullの場合、またはheadのnextがnullの場合は、headを返します

  • 遅い:=ヘッド、速い:=ヘッド、およびprev =null

  • fastはnullではなく、next of fastもnullではありませんが、実行してください

    • 前:=遅い

    • 遅い:=次の遅い

    • fast:=next of next of fast

  • 前の次:=null

  • l1:=sortList(head)

  • l2:=sortList(slow)

  • マージを返す(l1、l2)

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
class ListNode{
   public:
   int val;
   ListNode *next;
   ListNode(int data){
      val = data;
      next = NULL;
   }
};
ListNode *make_list(vector<int> v){
   ListNode *head = new ListNode(v[0]);
   for(int i = 1; i<v.size(); i++){
      ListNode *ptr = head;
      while(ptr->next != NULL){
         ptr = ptr->next;
      }
      ptr->next = new ListNode(v[i]);
   }
   return head;
}
void print_list(ListNode *head){
   ListNode *ptr = head;
   cout << "[";
   while(ptr){
      cout << ptr->val << ", ";
      ptr = ptr->next;
   }
   cout << "]" << endl;
}
class Solution {
   public:
   ListNode* sortList(ListNode* head) {
      if(!head || !head->next)return head;
      ListNode *slow = head, *fast = head, *prev = NULL;
      while(fast && fast->next){
         prev = slow;
         slow = slow->next;
         fast = fast->next->next;
      }
      prev->next = NULL;
      ListNode* l1 = sortList(head);
      ListNode* l2 = sortList(slow);
      return mergeList(l1,l2);
   }
   ListNode* mergeList(ListNode* l1, ListNode* l2){
      ListNode* temp = new ListNode(0);
      ListNode* p =temp;
      while(l1 && l2){
         if(l1->val<=l2->val){
            p->next = l1;
            l1 = l1->next;
         }else{
            p->next = l2;
            l2 = l2->next;
         }
         p = p->next;
      }
      if(l1){
         p->next = l1;
      }
      if(l2){
         p->next = l2;
      }
      return temp->next;
   }
};
main(){
   vector<int> v = {4,2,1,3,5,19,18,6,7};
   ListNode *h1 = make_list(v);
   Solution ob;
   print_list((ob.sortList(h1)));
}

入力

[4,2,1,3,5,9,8,6,7]

出力

[1, 2, 3, 4, 5, 6, 7, 18, 19, ]

  1. C++の次の小さな要素

    次に小さい要素は、その次の最初の小さい要素である要素です。例を見てみましょう。 arr =[1、2、3、5、4] 5の次に小さい要素は4であり、要素1、2、3の次に小さい要素は-1です。これは、それらの後に小さい要素がないためです。 アルゴリズム 乱数で配列を初期化します スタックを初期化します。 スタックに最初の要素を追加します。 配列の要素を繰り返し処理します。 スタックが空の場合は、現在の要素をスタックに追加します。 現在の要素はスタックの一番上の要素よりも小さいですが。 一番上の要素を、次に小さい要素を現在の要素として印刷します。

  2. C++でランダムポインタを使用してリストをコピーする

    リンクリストは線形データ構造であり、各ノードには2つのブロックがあり、一方のブロックにはノードの値またはデータが含まれ、もう一方のブロックには次のフィールドのアドレスが含まれます。 各ノードにリスト内の他のノードを指すランダムポインタが含まれるようなリンクリストがあると仮定します。タスクは、元のリストと同じリストを作成することです。ランダムなポインタを持つ元のリストからリストをコピーすることを、リンクリストの「ディープコピー」と呼びます。 例 入力-1 出力: 5-> 2 -> 3 -> 7 ->4 -> 説明: この問題を解決するためのア