判断两个链表是否相交并且返回第一个交点

在携程面试的一道算法题,主要的考点在于两个链表交叉后,以后的部分都是一样的,只可能是Y型的交叉而不可能出现X型的交叉,

首先定义节点:

struct Node{
	int data;
	Node* next;
};

最笨的方法是遍历所有的节点进行比较,比如

Node* ifCrossed(Node* list1,Node* list2){
	Node* one = list1;Node* two = list2;
	while(one){
		while(two){
			if(two==one) return one;
			two=two->next;
		}
		one=one->next;
	}
	return NULL;
}
如果这么写,那么那么你跪了,面试官肯定会认为你差劲的,而应该如下解决

Node* ifCrossed(Node* list1,Node* list2){
	Node* one = list1;Node* two = list2;
	int len1 = 0,len2 = 0;
	while(one) {len1++;one=one->next;}
	while(two) {len2++;two=two->next;}
	one = list1;two = list2;
	if(len1>len2){
		for(int i = 0; i < len1-len2;i++) one=one->next;
	}else{
		for(int i = 0; i < len2-len1;i++) two=two->next;
	}
	while(one!=two&&one&&two){
		one=one->next;
		two=two->next;
	}
	return one;
}
如果这么写呢,估计面试官就会面带微笑了!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值