题目:假设有两个按元素值依次递增次序排列的线性表,均以单链表的形式存储。请编写算法将这两个单链表归并为一个按元素值递减次序排列的单链表,并要求利用原来两个单链表的结点存放归并后的单链表。
分析:意思就是两条递增链表合并成为一条递减链表,然后还不能重新创建新的链表,要在原有的两条链表上修改,要最终的链表逆序,所以使用头插法,将AB两条链表的元素进行比较,较小的进行头插,和Day2类似,Day2时顺序表,这个是链表,大同小异。
算法思想:A、B分别设置指针p、q,依次比较p->data和q->data,然后将较小的结点头插进合并链表中,直到遍历完两条链表,遍历过程中如果其中一条链表为空了,那么就将剩下的链表依次头插进合并链表即可。
代码:
Linklist merge(Linklist &A,Linklist &B){
LNode *p=A->next; // 结点初始化
LNode *q=B->next;
A->next=Null; // AB的头指针置空
B->next=Null;
while(p!=NULL && q!=NULL){
if(p->data<q->data){
r=p->next; // ❤头插法,将较小的进行头插
p->next=A->next;
A->next=p;
p=r;
}
else{
r=q->next;
q->next=A->next;
A->next=q;
q=r;
}
}
while(q!=NULL){ // 长度相等的部分遍历完了,B有剩余,将B剩下的元素全部依次进行头插即可
r=q->next;
q->next=A->next;
A->next=q;
q=r;
}
while(p!=NULL){ // 长度相等的部分遍历完了,A有剩余,将A剩下的元素全部依次进行头插即可
r=p->next;
p->next=A->next;
A->next=p;
p=r;
}
}