问题
- 输入两个链表,找出它们的第一个公共节点。
解决
//1、暴力解法
class Solution {
ListNode getIntersectionNode(ListNode headA, ListNode headB) {
while(headA!=null){
ListNode check=headB;
while(check!=null){
if(headA==check){
return check;
}
check=check.next;
}
headA=headA.next;
}
return null;
}
}
- 时间复杂度O(n*m)
//2、使用hashset
class Solution{
ListNode getIntersectionNode(ListNode headA,ListNode headB){
Set<ListNode> set=new HashSet<ListNode>();
while(headA!=null){
set.add(headA);
headA=headA.next;
}
while(headB!=null){
if(set.contains(headB)){
return headB;
}
headB=headB.next;
}
return null;
}
}
- 时间复杂度O(m+n),空间复杂度O(m)
//3、双指针
class Solution{
//不管A、B相不相交都有两种情况:等长、不等长(假设A=a+c,B=b+c,那么A+b=B+a)==>
ListNode getIntersectionNode(ListNode headA,ListNode headB){
if(headA==null||headB==null) return null;
ListNode pA=headA,pB=headB;
while(pA!=pB){ //当pa=pb时它可能是公共结点有可能是null
// pA=pA==null?headA:headB.next;
// pB=pB==null?headA.next:headB;
pA = pA == null ? headB : pA.next; //pa等于空,那么就将pa指向headB,让其增加b个结点,达到a+b+c,否则就是每页走完当前路线,应该继续往下走
pB = pB == null ? headA : pB.next; //pb等于空,那么就将pb指向headA,让其增加a个结点,达到a+b+c,否则就是每页走完当前路线,应该继续往下走
}
return pA;
}
}
- 时间复杂度O(m+n),空间复杂度O(1)