您的位置:首页 > 编程语言

编程之美--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),再一起走,他们会同时到达的相同点即是答案。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息