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);
}