設A和B是兩個按元素值遞增有序的單鏈表,寫一算法將A和B歸並為按按元素值遞減有序的單鏈表C,試分析算法的時間復雜度。(利用上篇帶有頭結點的線性鏈表操作)
#include <stdio.h>
#include <malloc.h>
typedef int DataType;
#include "LinList.h"
void main()
{
SLNode *head_A,*head_B,*c,*pa,*pb,*pc;
int i,j,x;
ListInitiate(&head_A);//初始化鏈表a
ListInsert(head_A,0,1);//a遞增鏈表
ListInsert(head_A,1,3);
ListInsert(head_A,2,5);
ListInsert(head_A,3,7);
pa=head_A->next;
ListInitiate(&head_B);//初始化鏈表b
ListInsert(head_B,0,2);//b遞增鏈表
ListInsert(head_B,1,3);
ListInsert(head_B,2,6);
ListInsert(head_B,3,8);
ListInsert(head_B,4,9);
ListInsert(head_B,5,12);
pb=head_B->next;
ListInitiate(&c);
/*
設a鏈表長度為an,b鏈表長度為bn,
算法時間復雜度:O(an+bn)
*/
while(pb!=NULL && pa!=NULL)
{
pc=(SLNode *)malloc(sizeof(SLNode));
if(pa->data <= pb->data)
{
pc->data=pa->data;
pa=pa->next;
}
else
{
pc->data=(pb->data);
pb=pb->next;
}
//插入步驟
pc->next=c->next;
c->next=pc;
}
if(pa==NULL)//如果a鏈表讀完了,把剩下的b鏈表賦給c
{
while(pb!=NULL)
{
pc=(SLNode *)malloc(sizeof(SLNode));
pc->data=pb->data;
pb=pb->next;
pc->next=c->next;
c->next=pc;
}
}
else//如果b鏈表讀完了,把剩下的a鏈表賦給c
{
while(pa!=NULL)
{
pc=(SLNode *)malloc(sizeof(SLNode));
pc->data=pa->data;
pa=pa->next;
pc->next=c->next;
c->next=pc;
}
}
printf("輸出a遞增鏈表:\n");
for(i=0;i<ListLength(head_A);i++)
{
ListGet(head_A,i,&x);
printf("%d ",x);
}
printf("\n\n");
printf("輸出b遞增鏈表:\n");
for(i=0;i<ListLength(head_B);i++)
{
ListGet(head_B,i,&x);
printf("%d ",x);
}
printf("\n\n");
printf("輸出c鏈表:\n");
for(i=0;i < ListLength(c);i++)
{
ListGet(c,i,&x);
printf("%d ",x);
}
printf("\n\n");
Destroy(&head_A);
Destroy(&head_B);
Destroy(&c);
}
設A和B是兩個按元素值遞增有序的單鏈表,寫一算法將A和B歸並為按按元素值遞減有序的單鏈表C,試分析算法的時間復雜度。(利用上篇帶有頭結點的線性鏈表操作)