面试题92:两个链表集合做差
2016-06-08 15:34
267 查看
题目:
已知集合A和B的元素分别用不含头结点的单链表存储,函数difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中。例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成计算后A={10,20,30}。
思路:
遍历链表A一次,遍历链表B多次。
时间复杂度:
O(n1*n2)
实现如下:
struct node
{
int elem;
node* next;
};
void difference(node** LA, node* LB)
{
node *pa, *pb, *pre, *q;
pre = NULL;
pa = *LA;
while (pa)
{
pb = LB;
while (pb&&pb->elem!=pa->elem) //2
pb = pb->next;
if (pb) //3
{
if (!pre)//要删除的是第一个结点
*LA = pa->next; //4
else
pre->next= pa->next; //5
q = pa;
pa = pa->next;
free(q);
}
else
{
pre = pa; //6
pa = pa->next;
}
}
}
已知集合A和B的元素分别用不含头结点的单链表存储,函数difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中。例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成计算后A={10,20,30}。
思路:
遍历链表A一次,遍历链表B多次。
时间复杂度:
O(n1*n2)
实现如下:
struct node
{
int elem;
node* next;
};
void difference(node** LA, node* LB)
{
node *pa, *pb, *pre, *q;
pre = NULL;
pa = *LA;
while (pa)
{
pb = LB;
while (pb&&pb->elem!=pa->elem) //2
pb = pb->next;
if (pb) //3
{
if (!pre)//要删除的是第一个结点
*LA = pa->next; //4
else
pre->next= pa->next; //5
q = pa;
pa = pa->next;
free(q);
}
else
{
pre = pa; //6
pa = pa->next;
}
}
}
相关文章推荐
- 《程序员修炼之道--从小工到专家》阅读笔记01
- 程序员实习电话面试
- 淘宝网前端开发面试题(一)--HTML & CSS 面试题
- 面试题42-2:左旋转字符串
- 程序员该何去何从?
- 程序员的出路-追求卓越,有计划、有目标高效的做事情
- 总结程序员成长的几个阶段的心态
- .NET面试.NET Framework 各个版本的区别
- 高级Android工程师面试回忆录
- 面试(1)-java-se-字符串
- 高效程序员的7个习惯
- 黑马程序员:WWDC大会就要先睹为快
- iOS-面试秘籍
- .Net 常见面试题
- 天下熙熙皆为利来,天下攘攘皆为利往
- 面试题出错
- 黎活明给程序员的忠告
- 程序员福利:各大平台免费接口,非常实用
- 十道海量数据处理面试题与十个方法大总结
- 谈谈 BATJ3 面试