设计算法将两个递增有序的带头结点的单链表 A、B 合并为一个递增有序的带头结 点的单链表,并要求算法的时间复杂度为两个表长之和的数量级
void Merge_LinkList1(node* La,node *Lb){
node *pa, *pb, R;
pa = La->next;
pb = Lb->next;
R = La;
while (pa!=NULL && pb!=NULL){
if (pa->data <= pb->data){
R->next = pa;
R = pa;
pa = pa->next;
}
else if (pa->data > pb->data){
R->next = pb;
R = pb;
pb = pb->next;
}
}
if (pa != NULL)
R->next = pa;
if (pb != NULL)
R->next = pb;
delete Lb;
}
设计算法将链表 L 就地逆置,即利用原表各结点的空间实现逆置
void listReverse_L(node*& L){
node *p, *q;
p = L->next;
L->next = NULL;
while (p){
q = p->next;
p->next = L->next;
L->next = p;
p = q;
}
}
typedef node* elementType;
void reverse(node*& L){
seqStack S;
initialStack(S);
u = L;
while (u){
pushStack(u);
u = u->next;
}
if (stackEmpty(S))
return;
stackTop(S,u;)
L = u;
R = u;
popStack(S, u);
while (!stackEmpty(S)){
stackTop(S, u);
R->next = u;
u->next = NULL;
R = u;
popStack(S, u);
}
}
设计算法将两个递增有序的带头结点的单链表 A、B 合并为一个递减有序的带头结 点的单链表,并要求算法的时间复杂度为两个表长之和的数量级
node* listJoinAndReverse_L(node* A, node* B){
node *pa, *pb, *p, *L;
pa = A->next;
pb = B->next;
L = A;
L->next = NULL;
while (pa != NULL && pb != NULL){
if (pa->data < pb->data){
p = pa->next;
pa->next = L->next;
L->next = pa;
pa = p;
}
else{
p = pb->next;
pb->next = L->next;
L->next = pb;
pb = p;
}
}
while (pa != NULL){
p = pa->next;
pa->next = L->next;
L->next = pa;
pa = p;
}
while (pb != NULL){
p = pb->next;
pb->next = L->next;
L->next = pb;
pb = p;
}
return L;
}