算法:两个链表的第一个公共节点
问题
- 输入两个链表,找出它们的第一个公共节点。
解决
//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)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程