考研数据结构(每日一题)
题目:设A和B是两个单链表(带头节点),其中元素递增有序,设计一个算法从A和B中的公共元素产生单链表C,要求不破坏A、B的结点
算法图解:
算法思想:
表A,B都有序,依次比较A,B的元素,将元素值较小的指针往后移,若相等,则创建一个新结点等于两结点的值,使用尾插法插入到新链表中,并将两个指针同时后移一位。直到表尾,若其中一个有剩余,无需处理。
完整代码:
LinkList Common(LinkList A,LinkList B){
LNode *p = A -> next;
LNode *q = B -> next;
C = (LinkList)malloc(sizeof(LNode));
r = c; //尾插
while(p != NULL && q != NULL){
if(p -> data < q -> data){ //若p的值小于q的值,则后移一位
p = p -> next;
}else if(q -> data < p -> data){ //若q的值小于p的值,则后移一位
q = q -> next;
}else( p -> data = q -> data){ //若p的值等于q的值
s = (LNode*)malloc(sizeof(LNode)); //生成一个新的结点
s -> data = p -> data; //将公共直赋值给新结点
r -> next = s; //尾插法
r = s;
p = p -> next;
q = q -> next;
}
}
r -> next = NULL; //C尾指针置空
}