问题
设有两个从小到大排序的带头结点的有序链表。试编写求这两个链表交运算的算法(),要求结果链表仍是从小到大排序,但无重复元素。
分析
11题的思路稍微改一下,将l1链表置空,当l1和l2对应结点相等时,再判断一下是不是和新l1的尾结点相等,不相等时插入。
代码
void intersection(LinkList &l1, LinkList &l2) {
LNode *p = l1 -> next, *q = l2 -> next, *r;
l1 -> next = NULL;
r = l1;
while(p && q) {
if(p -> data == q -> data) {///值相等,插入到l1中,尾插法
if(r == l1) {///r = l1 第一个结点插入,不需要判断是否和尾结点元素相等
LNode *p1 = p -> next;
p -> next = NULL;
r -> next = p;
r = p;
p = p1;
} else {
if(p -> data != r -> data) {///不是第一个结点,且和尾结点元素值不相等,插入
LNode *p1 = p -> next;
p -> next = NULL;
r -> next = p;
r = p;
p = p1;
}else {
p = p -> next;
q = q -> next;
}
}
}else if(p -> data < q -> data) {///移动p
p = p -> next;
}else if(p -> data > q -> data){///移动q
q = q -> next;
}
}
}
源代码
http://123.206.59.223:8080/code/code/12.rar