编程之美--3.6编程判断两个链表是否相交

思考1


暴力破解,时间复杂度O(n1*n2)

代码1


private static boolean solution1(ListNode head1, ListNode head2) {
		ListNode cur1 = head1;
		while(cur1!=null){
			ListNode cur2 = head2;
			while(cur2!=null){
				if(cur2 == cur1){
					return true;
				}
				cur2 = cur2.next;
			}
			cur1 = cur1.next;
		}
		return false;
	}

思考2


1 空间换时间,考虑hashset记录第一个链表所有节点,再找第二个链表是否存在节点在hashset中。

代码2


private static boolean solution2(ListNode head1,ListNode head2){
		HashSet<ListNode> record = new HashSet<ListNode>();
		ListNode cur1 = head1;
		while(cur1!=null){
			record.add(cur1);
			cur1 = cur1.next;
		}
		ListNode cur2 = head2;
		while(cur2!=null){
			if(record.contains(cur2)){
				return true;
			}
			cur2 = cur2.next;
		}
		return false;
	}

思考3


1 考虑不用多余的空间,从链表本身特性出发。把第一个链表的最后一个节点next链到下一个链表头节点。如果两表相交,必然形成环;如果不相交,必然会走到null。转换为一个判断链表是否有环的问题。

2 leetcode有判断环的问题。参考http://blog.csdn.net/xift810/article/details/20378549


思考4


1 如果不修改链表结构。考虑链表如果相交,则他们在null之前的最后一个节点必然相等。

代码4


private static boolean solution3(ListNode head1,ListNode head2){
		ListNode cur1 = head1;
		while(cur1.next!=null){
			cur1 = cur1.next;
		}
		ListNode cur2 = head2;
		while(cur2.next!=null){
			cur2 = cur2.next;
		}
		return cur1 == cur2;
	}

扩展题1


1 分情况: 如果两个都无环,则情况同一。如果只有一个有环,则不相交。如果两个都有环,则一快一慢走,必然走到一起。

2 逻辑上,先让两个指针分别从头一快一慢走,如果相等,跳出,相交。如果其中一个变成null,判断另外一个是否有环,根据结果得到答案。

扩展题2


1 用方法3,然后判断总环的初始点。leetcode有http://blog.csdn.net/xift810/article/details/20379439

2 先确定链表1和链表2各自的长度l1 l2,然后让长的链表先走 (l1-l2),再一起走,他们会同时到达的相同点即是答案。






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值