2.7 线性表的应用
2.7.1 线性表合并
2.7.2 有序表合并
-
顺序有序表
void MergeList_Sq(SqList LA, SqList LB, SqList &LC) { LC.length = LA.length + LB.length; LC.elem = new ElemType[LC.length]; // 给新表分配数组空间 pc = LC.elem; pa = LA.elem; pb = LB.elem; pa_last = LA.elem + LA.length - 1; pb_last = LB.elem + LB.length - 1; while(pa <= pa_last && pb <= pb_last) { // 两表都未到达表尾 if(*pa < *pb) *pc++ = *pa++; else *pc++ = *pb++; } while(pa <= pa_last) *pc++ = *pa++; // LB到达表尾 while(pb <= pb_last) *pc++ = *pb++; // LA到达表尾 }
时间复杂度为O(m + n), 空间复杂度为O(m + n) 【m, n分别为两表的长度】
-
链表有序表
非递减链表A,B,合成一个非递减链表C
void MergeList(LinkList &LA, LinkList &LB, LinkList &LC) { pa = LA -> next; pb = LB -> next; LC = LA; // LA的头结点作为LC的头结点 pc = LC; while(pa && pb) { if(pa -> data <= pb -> data) { pc -> next = pa; // pa指的结点连到pc后面 pc = pa; pa = pa -> next; } else { pc -> next = pb; pc = pb; pb = pb -> next; } } pc -> next = pa ? pa : pb; // 非空表的剩余部分链接到pc所指结点之后 delete LB; // 释放LB头结点 }
时间复杂度为O(m + n), 空间复杂度为O(1) 【因为不需要建立新的结点空间,只需要将原表结点间的连接关系解除再重新建立新的关系】