首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

一个链表有关问题

2012-03-07 
一个链表问题假定两个单向链表实例p1,p2,如何以最快速度判断是否相交(即具有同地址节点)?struct list{int

一个链表问题
假定两个单向链表实例p1,p2,如何以最快速度判断是否相交(即具有同地址节点)?

struct list{
int val;
list *next;
} l1,l2;

[解决办法]
把第一个链表遍历到尾部,把第二个链表的头部链接到第一个链表的尾部。
如果两个链表相交,这时链表就有环了,如果不相交就是一个单向链表。

需要注意的是,这里如果有环,则第二个链表的表头一定在环上,我们只需要从第二个链表开始遍历,看是否会回到起始点就可以判断出来。

这个复杂度是O(N)
[解决办法]
5楼的做法很不错。

还有一个做法是用Hashtable. 遍历第一个链表,将地址存入hashtable - O(N). 然后遍历第二个链表,检查地址是否已在Hashtable中存在。如果已存在,则说明两链表相交 - O(M)

整个复杂度O(N+M),相比5楼的做法,多了Hashtable的开销。
[解决办法]
那就先判断是不是循环链表了。两个循环链表相交的话,就完全成一个循环链表了。如果一个单链表和循环单链表相交,那就是一个有环的链表了。

热点排行