笔试被人BS了,请算法高手还解决链表的交集问题.

wcqgm 2008-10-25 12:13:37
各位兄弟,请为小弟弟看看,被人BS了,心里很难受.也想学习一下:
现有三个单链表A,B和C,其数据都是按从小到大的顺序(数据可能有相同的)来存储的,现要求对它们进行操作,现实A的链表内容为A,B和C的交集(公共部分,没有重复的记录)。同时对A中的其他结点进行释放内容(要求算法的复杂度为O(m+n+p)其中m,n,p分别为A,B,C的长度)
...全文
943 30 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
lemonrong 2008-11-05
  • 打赏
  • 举报
回复
分析的很清楚,学习了!
ws023 2008-11-03
  • 打赏
  • 举报
回复
归并排序问题~
winingsky 2008-10-31
  • 打赏
  • 举报
回复
用三个指针分别指向三个链表,用一个循环开始啊
tingsky 2008-10-31
  • 打赏
  • 举报
回复

如果以最短链表开始,折半,或者跳跃(步进n)的方式
fengcman 2008-10-31
  • 打赏
  • 举报
回复
这题不难,上面有解了,不再叙述 。 这中东西在普通考研书中应该都有描述
hertz2007 2008-10-30
  • 打赏
  • 举报
回复
确实不需要那么麻烦你。LCS算法针对的是未排序序列。而此题各组序列已排序,因此直接比较就可以了。
catmonkeyxu 2008-10-30
  • 打赏
  • 举报
回复
ls的大哥,这题不用那么麻烦吧
hertz2007 2008-10-30
  • 打赏
  • 举报
回复
最大公共子序列问题,用动态规划方法做。
sxxiaozi 2008-10-30
  • 打赏
  • 举报
回复
参考下set_intersection()函数,根据他的代码思想自己写个实现3个链表交(可以在A上操作)的函数,至于释放空间的话,可以等交完了链表后面的全部释放就可以了
ayu_J 2008-10-27
  • 打赏
  • 举报
回复


算法() //伪代码
{
设置三个指针分别指向三个链表第一个元素;
while(三个元素的指针都不为空)
if(A链表指针指向的元素==B链表指针指向的元素==链表指针指向的元素)
{
A表指针向后移一个;
B、C表把第一个元素释放同时指针都向后移一个;
}
else A、B、C表指针指向的元素都释放并指针都向后移一个;
if(A表指针不为空)A表指针后面的所有元素逐个释放;
if(B表指针不为空)B表指针后面的所有元素逐个释放;
if(C表指针不为空)B表指针后面的所有元素逐个释放;
}
youxia000 2008-10-27
  • 打赏
  • 举报
回复
看来没啥问题了
wzyzb 2008-10-27
  • 打赏
  • 举报
回复
mark jf
wcqgm 2008-10-27
  • 打赏
  • 举报
回复
谢谢各位兄弟,小弟受教了.
绿色夹克衫 2008-10-27
  • 打赏
  • 举报
回复 1
大家给的方法都不错(除了我开头弄成了并集的那个),基本上都是O(m+n+p),也就差写出具体代码了!
我大概写个程序构架吧,lz自己改一改应该就差不多了,也是O(m+n+p)的(用以弥补我开头弄成了并集,误导lz的错误)

while(3个指针都未走到最后)
{
while(p2->data < p1->data)
{
p2 = p2->NextNode;
}

while(p3->data < p1->data)
{
p3 = p3->NextNode;
}

while(p1->data < p2->data 或者 p1->data < p3->data)
{
temp = p1->NextNode;
delete(p1);
p1 = temp;
}

if(p1->data == p2->data == p3->data)
{
p1 = p1->NextNode;
p2 = p2->NextNode;
p3 = p3->NextNode;
}

lastp1 = p1;

while(p1->data == lastp1->data)
{
temp = p1->NextNode;
delete(p1);
p1 = temp;
}

lastp1->NextNode = p1;
}

最后:删除包括p1在内的A后面的所有元素

(希望这次没有啥疏漏)
wuyi8808 2008-10-26
  • 打赏
  • 举报
回复
up
dengqianyi2008 2008-10-26
  • 打赏
  • 举报
回复
iii) 若 pa->data > pc->data, pb++,pc++;转2);
我喜欢这样写:pa->data == pc->data, pb++,pc++,pa++;转2);
不知道行不行
dengqianyi2008 2008-10-26
  • 打赏
  • 举报
回复
好好想下尾巴的算法,差不多就能编写出来了吧?
xuboamei 2008-10-25
  • 打赏
  • 举报
回复
对三个一链表进行一遍遍历,就可以找出来啊,很简单啊
voiceofwind 2008-10-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 tailzhou 的回复:]
ls错看成是求并集了;

1) 指针pa,pb,pc分别指向a,b,c的第一个节点;
2) 比较pb->data与pc->data;
a)若pb==NULL or pc==NULL,删除pa指向的节点,以及之后的所有节点,结束;
b)若pb->data > pc->data,pc++,继续2);
c)若pb->data < pc->data,pb++,继续2);
d)若pb->data == pc->data 转 3);
3) 比较 pa->data 与 pc->data;
i) 若 pa==NULL,结束;
ii) 若 pa->data < pc->data, 删除pa指向的节点,…
[/Quote]

学习了,很强啊
wcqgm 2008-10-25
  • 打赏
  • 举报
回复
楼上能否给些源代码或伪代码?谢谢
加载更多回复(10)

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧