首页 > 编程语言 >算法:两个链表的第一个公共节点

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

时间:2022-08-23 22:22:12浏览次数:61  
标签:ListNode next 链表 算法 pA headB headA null 节点

问题

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

解决

 //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)

标签:ListNode,next,链表,算法,pA,headB,headA,null,节点
From: https://www.cnblogs.com/zhangsanM/p/16618070.html

相关文章

  • 「数据结构与算法」链表 —— 看这一篇就够了(超详细)
     一、链表简介链表是一种物理存储单元上非连续、非顺序的存储结构,数据结构的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点......
  • 开坑之Acwing算法进阶课题单
    当初五折的时候冲动消费买下的,现在看题单内容挺丰富的,适合打基础,也适合存板子,于是回来刷.(不一定看视频)需要学习的知识点包括1图论1.1网络流1.1.1最大流1.1.1.1算......
  • 【Java基础】数组中的常见算法:二分查找算法
    1.实现二分查找算法要求数组必须是有序的。把中间的值和要查询的值进行比较,相等则返回索引下标arr[middle]>number,则让尾索引等于middle-1,arr[middle]<number,则让开始......
  • 2022“杭电杯”中国大学生算法设计超级联赛(10)
    比赛链接:https://vjudge.net/contest/511178C-WavyTree题意:长为\(n\)的序列,每一步操作可以让\(a_i\)变成\(a_j\),花费为\(\lverta_i-a_j\rvert\)。现在要......
  • 不等式视角下的策略梯度算法
    不等式视角下的策略梯度算法作者:Xingzhe.AI来自:行者AI引言强化学习(ReinforcementLearning,RL),也叫增强学习,是指一类从(与环境)交互中不断学习的问题以及解决这类问题的......
  • 因子分析与EM算法
    FactorAnalysis目录FactorAnalysisBackgroundMarginalandConditionalDistributionofGaussianFactorAnalysisModelBackgroundwhenm(numberofsamples)<n(......
  • 统计分析 -- 聚类算法模型
    统计分析--聚类算法模型距离分析数据标准化欧氏距离与量纲有关,因此,有时需要对数据进行预处理,如标准化等。在MATLAB中的命令是zscore,调用格式Z=zscore(X)输入X......
  • leetcode160:相交链表
    /***题目:*给你两个单链表的头节点headA和headB,请你找出并返回两个单链表相交的起始节点。*如果两个链表不存在相交节点,返回null。*注意......
  • 【735】相关python函数用在算法题中提高效率
    Counter:用来计数使用fromcollectionsimportCounterfilter:用来表示满足一个函数的所有情况相关题目:260.只出现一次的数字III......
  • AcWing算法基础课---第一讲基础算法---05位运算
    ###整数n的二进制数的第k位数```n>>k&1```###lowbit运算```lowbit(x)x&(~x+1)=x&(-x)```###AcWing801.二进制中1的个数```#include<iostream>usingn......