归并算法,将两个有序表合并成一个有序表,把LA和LB合并成一个新的有序表LC。
遍历LA和LB,比较大小,把其中较小的放入LC中,再对应的有序表指针向后移动一格。
顺序表结构实现
void UnionList(SqList * LA,SqList * LB,SqList * LC){
int i = 0,j = 0,k = 0;
while (i < LA -> length && j < LB -> length){
if(LA -> data[i] > LB -> data[j]){
LC -> data[k] = LB -> data[j];
j++; k++;
}
else{
LC -> data[k] = LA -> data[i];
i++; k++;
}
}
while (i < LA -> length){ //LA没有遍历完毕
LC -> data[k] = LA -> data[i];
i++; k++;
}
while (j < LB -> length){//LB没有遍历完毕
LC -> data[k] = LB -> data[j];
j++; k++;
}
LC -> length = k;
}
单链表实现
void UnionList1(LinkNode * LA,LinkNode * LB,LinkNode * LC){
LinkNode *pa = LA -> next,*pb = LB -> next,*s,*r;
r = LC;
while (pa != NULL && pb != NULL){
if(pa -> data < pb -> data){
s = (LinkNode * ) malloc(sizeof(LinkNode));
s -> data = pa -> data;
r -> next = s; r = s;
pa = pa -> next;
}
else{
s = (LinkNode * ) malloc(sizeof(LinkNode));
s -> data = pb -> data;
r -> next = s; r = s;
pb = pb -> next;
}
}
while (pa != NULL){
s = (LinkNode * ) malloc(sizeof(LinkNode));
s -> data = pa -> data;
r -> next = s; r = s;
pa = pa -> next;
}
while (pb != NULL){
s = (LinkNode * ) malloc(sizeof(LinkNode));
s -> data = pb -> data;
r -> next = s; r = s;
pb = pb -> next;
}
r -> next = NULL;
}
找出A,B,C三个有序表的公共元素,并存储到A中,要求性能尽可能好,时间复杂度为O(m+n+p),其中m,n,p 为A,B,C的长度。
void Comnode(LinkNode * LA,LinkNode * LB,LinkNode * LC){
LinkNode *pa = LA -> next,*pb = LB -> next,*pc = LC -> next,*r,*s;
r = LA;
r -> next = NULL;
while (pa != NULL){
while (pb != NULL && pa -> data > pb -> data)
pb = pb -> next;
while (pc != NULL && pa -> data > pc -> data)
pc = pc -> next;
if(pb != NULL && pc != NULL && pa -> data == pb -> data && pa -> data == pc -> data){
r -> next = pa;
r = pa;
pa = pa -> next;
}
else{
s = pa;
pa = pa -> next;
free(s);
}
}
r -> next = NULL;
LA = r;
}
删除一个有序单链表中重复的结点
void dels(LinkNode * L){
LinkNode *p = L -> next,*q;
while (p -> next != NULL){
if(p -> data == p -> next -> data){
q = p -> next;
p -> next = q -> next; //直接指向下下个,跳过了下一个
free(q);
}
else
p = p -> next;
}
}
合并两个顺序表并找出中位数,例如序列S1 = (11,13,15,17,19),S2 = (2,4,6,8,20),则S1和S2的中位数是11。要求在时间和空间都尽可能高效。
ElemType M_Search(SqList * A,SqList * B){ //A和B长度相同
int i = 0,j = 0,k = 0;
while (i < A -> length && j < B -> length){ //两个序列都没有扫描完毕
k++; //归并的元素 +1
if(A -> data[i] < B -> data[j]){
if(k == A -> length){
printf("中位数是:%d",A -> data[i]);
return A -> data[i];
}
i++;
}
else{
if(k == B -> length){
printf("中位数是:%d",B -> data[i]);
return B -> data[j];
}
j++;
}
}
}