赞
踩
求两个链表相交的思路与求环比较相似,下面我们来看下几种常见的思路,假定节点结构为:
staticclassnode{
Objectvalue;
nodenext;
node(Objecto){
this.value=o;
}
}
头结点也已经声明好了:
static node head1;
static node head2;
思路 1:逐个尝试,用两个指针分别指向两个链表的头,一个指针每走一步,另一个指针则从头走到尾,如果两节点相遇则说明链表相交。平均时间复杂度O(n^2),空间复杂度为O(1)。代码如下:
public static Boolean across1(){
node p1 = head1,p2 = head2;
while(p1!=null){
while(p2!=null){
If(p1==p2)
return true;
p2= p2.next;
}
p1 = p1.next;
}
return false;
}
思路2:逐个尝试的方法时间复杂度过高,这时可以用一个HashSet存放两个链表,当put()返回失败时,即说明存在交点。平均时间复杂度和空间复杂度为O(n)。代码如下:
public staticBoolean across2(){
node p1 = head1,p2 = head2;
HashSet hs = newHashSet();
while(p1!=null){
hs.add(p1);
p1 = p1.next;
}
while(p2!=null){
if(!hs.add(p2))
return true;
p2 = p2.next;
}
return false;
}
思路3:如果两个链表相交,那么必然拥有同一个尾节点,可以用两个指针同时从两个链表的头部出发,当都到达尾部时,如果都指向同一个节点,则说明链表相交。
思路4:还有一种比较奇特的思路是将其中一个链表的尾部指向另一个链表的头部,如果相交则必然有环,即可使用时间和空间均比较优秀的快慢指针判断即可。
总结:判断两链表是否相交时,思路3和思路4的时间及空间复杂度都比思路1和思路2的好,但不方便求交点。思路3和4实现并不难,读者可以自己去尝试练习一下。
如果你有更好的思路欢迎在评论区留言,欢迎点赞转发,感谢阅读。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。