编程之美--3.6编程判断两个链表是否相交
2014-08-04 15:39
288 查看
思考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),再一起走,他们会同时到达的相同点即是答案。
暴力破解,时间复杂度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),再一起走,他们会同时到达的相同点即是答案。
相关文章推荐
- 编程之美3.6——编程判断两个链表是否相交
- 编程判断两个链表是否相交 结构之法 6
- [编程之美] PSet3.6 编程判断两个链表是否相交
- 读书笔记之编程之美 - 3.6 编程判断两个链表是否相交
- 编程之美3.6—判断两个链表是否相交
- 编程之美:编程判断两个链表是否相交
- 编程之美-编程判断两个链表(可能含环)是否相交以及相交的第一个结点
- 编程之美-3.6-编程判断两个链表是否相交
- 3.6 编程判断两个链表是否相交
- 编程判断两个链表是否相交
- 编程判断两个链表是否相交
- 编程之美-3.6-编程判断两个链表是否相交
- 编程判断两个链表是否相交
- 《编程之美》——编程判断两个链表是否相交
- 判断两个链表是否相交(在线编程测试平台www.anycodex.com)
- 编程之美-3.6-编程判断两个链表是否相交
- 【编程之美】3.6 - 判断两个链表是否相交
- 编程判断两个链表是否相交
- 编程之美-判断两个链表是否相交方法整理
- 单链表之编程判断两个链表是否相交