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

C++を使用して2つの並べ替えられたリンクリストをマージします。


問題の説明

与えられた2つのソートされた単一リンクリスト。 2つの並べ替えられたリンクリストをマージする関数を記述します

List1: 10->15->17->20
List2: 5->9->13->19
Result: 5->9->10->13->15->17->19->20

アルゴリズム

1. Traverse both lists
   1.1. If list1->data < list2->data
      1.1.1 Add list1->data to new list and increment list1 pointer
   1.2 If list2->data < list1->data
      1.2.1 Add list2->data to new list and increment list2 pointer
2. Repeat procedure until both lists are exhausted
3. Return resultant list

#include <iostream>
#include <new>
#define SIZE(arr) (sizeof(arr) / sizeof(arr[0]))
using namespace std;
struct node {
   int data;
   struct node *next;
};
node *createList(int *arr, int n){
   node *head, *p;
   p = head = new node;
   head->data = arr[0];
   head->next = NULL;
   for (int i = 1; i < n; ++i) {
      p->next = new node;
      p = p->next;
      p->data = arr[i];
      p->next = NULL;
   }
return head;
}
void displayList(node *head){
   while (head != NULL) {
      cout << head->data << " ";
      head = head->next;
   }
   cout << endl;
}
node *mergeSortedLists(node *head1, node *head2){
   node *result = NULL;
   if (head1 == NULL) {
      return head2;
   }
   if (head2 == NULL) {
      return head1;
   }
   if (head1->data < head2->data) {
      result = head1;
      result->next = mergeSortedLists(head1->next, head2);
   } else {
      result = head2;
      result->next = mergeSortedLists(head1, head2->next);
   }
   return result;
}
int main(){
   int arr1[] = {10, 15, 17, 20};
   int arr2[] = {5, 9, 13, 19};
   node *head1, *head2, *result = NULL;
   head1 = createList(arr1, SIZE(arr1));
   head2 = createList(arr2, SIZE(arr1));
   cout << "First sorted list: " << endl;
   displayList(head1);
   cout << "Second sorted list: " << endl;
   displayList(head2);
   result = mergeSortedLists(head1, head2);
   cout << "Final sorted list: " << endl;
   displayList(result);
   return 0;
}

出力

上記のプログラムをコンパイルして実行する場合。次の出力を生成します-

First sorted list:
10 15 17 20
Second sorted list:
5 9 13 19
Final sorted list:
5 9 10 13 15 17 19 20

  1. C++で2つの二分木をマージする

    2つの二分木があり、一方をもう一方を覆うように配置すると、2つのツリーの一部のノードがオーバーラップし、他のノードがオーバーラップするとします。それらを新しいバイナリツリーにマージする必要があります。マージルールは、2つのノードがオーバーラップしている場合、ノード値を合計して、マージされたノードの新しい値として計算するようなものです。それ以外の場合は、空でないノードが新しいツリーのノードとして使用されます。 したがって、木が- その場合、出力は-になります これを解決するには、次の手順に従います- メソッドはmergeTrees()です。これは、2つのツリーノードn1と

  2. C++のリンクリストを使用して2つの多項式を追加します。

    この概念をよりよく理解するために、最初に必要なすべての基本的な内容をブラッシュアップしましょう。 リンクリスト リストのノードにオブジェクトとして各要素を格納するデータ構造です。すべてのメモには、2つの部分のデータハンと次のノードへのリンクが含まれています。 多項式 は変数と係数で構成される数式です。たとえば、x ^ 2-4x + 7 多項式リンクリスト 、多項式の係数と指数は、リストのデータノードとして定義されます。 リンクリストとして保存されている2つの多項式を追加します。同じ累乗の変数の係数を追加する必要があります。リンクリストノードには3つのメンバーが含まれ、係数値は次のノー