將兩個單鏈表合併成一個有序單鏈表

3.10
4.將兩個單鏈表合併成一個有序單鏈表

由於以前初學c++時所寫的代碼不堪入目,不符合規範性,完整性和魯棒性,於是今日重寫其核心算法以警示自己。

Node* Merge(Node p1Head, Node p2Head)
{
	if(p1Head == nullptr)
		return p2Head;
	if(p2Head == nullptr)
		return p1Head;
	
	Node* pMergedHead=nullptr;
	
	if(p1Head->info<p2Head->info)
	{
		pMergedHead=p1Head;
		pMergedHead->next=Merge(p1Head->next,p2Head);
	}
	else
	{
		pMergedHead=p2Head;
		pMergedHead->next=Merge(p1Head,p2Head->next)
	}
	return pMergedHead;
}

思路:因爲鏈表可以由結點輕鬆構造,所以首先需要創建單鏈表的元素,然後選擇構造方式構造單鏈表,本代碼爲後插構造單鏈表。然後有了鏈表,怎麼合併爲一個有序單鏈表。大體可以先嚐試排序構造的每個單鏈表,然後再在合併的時候進行有序比較排列即可。

#include<stdlib.h>
#include<stdio.h>
#include<iostream>
typedef struct Node {
 
 int info;

 struct Node *next;

}*List;
void creatList(List *head,int n) {

 int i;

 List p,q;

 *head = (List)malloc(sizeof(struct Node));

 (*head)->next = NULL;

 q = *head;

 for ( i = 0; i < n; i++)

 {

  p = (List)malloc(sizeof(struct
Node));

  cin >> p->info;

  p->next = q->next;

  q->next = p;

  p = q;

 }

}
int List_length(List a);

void maopaosort(List p) {

 List la, lb;

 int n = List_length(p);

 int i, j,temp;

 for ( i = 0,la=p->next; i < n;
i++,la=la->next)

 {

  for ( j = i+1,lb=la->next; j
< n; j++,lb=lb->next)

  {

   if
(la->info>lb->info)

   {

    temp
= la->info;

    la->info
= lb->info;

    lb->info
= temp;

   }

  }

 }

}
int List_length(List a) {

 int i=0;

 List p;

 p = a->next;

 while (p != NULL)

 {

  ++i;

  p = p->next;

 }

 return i;

}
void outputlist(List head) {

 List p;

 p = head->next;

 while (p!=NULL)

 {

  cout << p->info
<< " ";

  p=p->next;

 }

}
void merge(List l1, List l2, List *l3) {

 List p1,p2, p3;

 *l3 = l1;

 p1 = l1->next;

 p2 = l2->next;

 p3 = *l3;

 while (p1!=NULL&&p2!=NULL)

 {

  if (p1->info >
p2->info) {

   p3->next=
p2;

   p2 =
p2->next;

   p3 =
p3->next;

  }

  else

  {

   p3->next =
p1;

   p1 =
p1->next;

   p3 =
p3->next;

  }

}  

 if (p1 != NULL) {

  p3->next= p1;

 }

 else

 {

  p3->next= p2;

 }

}
int main() {

 List a, b, c;

 creatList(&a, 5);

 maopaosort(a);

 //outputlist(a);

 creatList(&b, 4);;

 maopaosort(b);

 //outputlist(b);

 merge(a, b, &c);

 //cout << endl;

 outputlist(c);

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章