暴力破解,时间复杂度O(n1*n2)
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;
}
1 空间换时间,考虑hashset记录第一个链表所有节点,再找第二个链表是否存在节点在hashset中。
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;
}
1 考虑不用多余的空间,从链表本身特性出发。把第一个链表的最后一个节点next链到下一个链表头节点。如果两表相交,必然形成环;如果不相交,必然会走到null。转换为一个判断链表是否有环的问题。
2 leetcode有判断环的问题。参考http://blog.csdn.net/xift810/article/details/20378549
1 如果不修改链表结构。考虑链表如果相交,则他们在null之前的最后一个节点必然相等。
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 分情况: 如果两个都无环,则情况同一。如果只有一个有环,则不相交。如果两个都有环,则一快一慢走,必然走到一起。
2 逻辑上,先让两个指针分别从头一快一慢走,如果相等,跳出,相交。如果其中一个变成null,判断另外一个是否有环,根据结果得到答案。
1 用方法3,然后判断总环的初始点。leetcode有http://blog.csdn.net/xift810/article/details/20379439
2 先确定链表1和链表2各自的长度l1 l2,然后让长的链表先走 (l1-l2),再一起走,他们会同时到达的相同点即是答案。