题目: 设A和B是两个单链表(带头结点),其中元素递增有序。设计一个算法,从A和B中的公共元素产生单链表C,要求不破坏A、B的结点。
分析:
- A、B两个链表的元素均递增有序,所以可以,按顺序,同时从A中和B中各取出一个结点的值来对比;
- 如果A中结点的值比较小,则A中的指针右移;
- 如果B中结点的值比较小,则B中的指针右移;
- 如果相等,则将结点值取出,赋与S结点;并将S结点插入C链表中;然后A、B中的指针各右移;
LinkList Get_Common(LinkList A,LinkList B,LinkList &C){
C->next =NULL; //确认c为空链表;
LNode *r;
r = C; //初始化指针;
if(A->next == NULL || B->next == NULL) return; //如果A或者B中存在空表;
LNode *p = A->next;
LNode *q = B->next;
while(p!=NULL && q!= NULL){
if(p->data > q->data){ //值比较小,则指针右移一位;
q =q->next;
}else if(p->data < q->data){
p = p->next;
}else{ //值相等;
LNode *s;
s=(LNode *)malloc(sizeof(LNode)); //创建*S结点;
s->data = p->data; //*S结点赋值;
r->next =s ; //将*S结点写入链表中
r =s; //C链表中的指针右移;
//A、B链表中剩余的元素继续比较;
p = p->next;
q = q->next;
}
}
r->next = NULL;
}