算法:两个链表的第一个公共节点

问题

  • 输入两个链表,找出它们的第一个公共节点。

解决

 //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)
posted @   new_monkey  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
点击右上角即可分享
微信分享提示