判断两个单链表是否相交

    首先,拿到这个题,我们第一反应可能是这样的:假设分别为A链表和B链表,那么只要每次得到一个A中的元素的地址值,就与B的所有节点的地址值比较,一直进行下去,直到,找到相等的节点或者A链表跑完了,那么这个思路会导致我们的问题时间复杂度,为O(length(A) * length(B)),显然,这个思路不可取。那么还有什么比较好的办法呢?答案是肯定的,假设两个单链表相交,那么他们相交之后会合成一个链表就像字母‘Y’一样,那么,两个单链表的状态无非是这四个字母的形状:I,Y,V, I I;那么,聪明的如你,肯定已经找到解法了。对,就是直接判断两个单链表的最后一个节点的地址是不是相等,若相等,那么,两个链表肯定相交,否则,则不相交;如果按照这个思路,时间复杂度就降低到O(length(A) +length(B)),下面是实现代码片段:

bool isIntersection(List *list1, List *list2){
	List *p, *q;
	bool flag = false;
	
	for (p = list1; p->next; p = p->next);	//找list1的尾节点 
	for (q = list2; q->next; q = q->next);	//找list2的尾节点
	
	if (p == q){
		flag = true; 
	}
	
	return flag; 
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值