首页 > 编程语言 >11.7算法

11.7算法

时间:2023-11-07 11:01:21浏览次数:37  
标签:11.7 相交 next 链表 算法 hb ha 节点

题目

相交链表
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。

图示两个链表在节点 c1 开始相交:

题目数据 保证 整个链式结构中不存在环。

注意,函数返回结果后,链表必须 保持其原始结构 。

自定义评测:

评测系统 的输入如下(你设计的程序 不适用 此输入):

intersectVal - 相交的起始节点的值。如果不存在相交节点,这一值为 0
listA - 第一个链表
listB - 第二个链表
skipA - 在 listA 中(从头节点开始)跳到交叉节点的节点数
skipB - 在 listB 中(从头节点开始)跳到交叉节点的节点数
评测系统将根据这些输入创建链式数据结构,并将两个头节点 headA 和 headB 传递给你的程序。如果程序能够正确返回相交节点,那么你的解决方案将被 视作正确答案 。

示例 1:

输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,6,1,8,4,5], skipA = 2, skipB = 3
输出:Intersected at '8'
解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,6,1,8,4,5]。
在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。
— 请注意相交节点的值不为 1,因为在链表 A 和链表 B 之中值为 1 的节点 (A 中第二个节点和 B 中第三个节点) 是不同的节点。换句话说,它们在内存中指向两个不同的位置,而链表 A 和链表 B 中值为 8 的节点 (A 中第三个节点,B 中第四个节点) 在内存中指向相同的位置。

示例 2:

输入:intersectVal = 2, listA = [1,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1
输出:Intersected at '2'
解释:相交节点的值为 2 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [1,9,1,2,4],链表 B 为 [3,2,4]。
在 A 中,相交节点前有 3 个节点;在 B 中,相交节点前有 1 个节点。
示例 3:

输入:intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2
输出:null
解释:从各自的表头开始算起,链表 A 为 [2,6,4],链表 B 为 [1,5]。
由于这两个链表不相交,所以 intersectVal 必须为 0,而 skipA 和 skipB 可以是任意值。
这两个链表不相交,因此返回 null 。

提示:

listA 中节点数目为 m
listB 中节点数目为 n
1 <= m, n <= 3 * 104
1 <= Node.val <= 105
0 <= skipA <= m
0 <= skipB <= n
如果 listA 和 listB 没有交点,intersectVal 为 0
如果 listA 和 listB 有交点,intersectVal == listA[skipA] == listB[skipB]

进阶:你能否设计一个时间复杂度 O(m + n) 、仅用 O(1) 内存的解决方案?

解答

ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
int lena = 0,lenb = 0;
ListNode *ha = headA;
ListNode *hb = headB;
while(headA->next != nullptr){
lena++;
headA = headA->next;
}
while (headB->next != nullptr)
{
lenb++;
headB = headB->next;
}
if(headA != headB){
return nullptr;
}
if(lena < lenb){
int i = lenb - lena;
// lena 第一个,lenb就是第i+1个,去比较是否相同,不相同就继续
while(i--){
hb = hb->next;
}
while(ha != nullptr){
if(ha!=hb){
ha = ha->next;
hb = hb->next;
}
else{
return ha;
}
}

}
else{
            int i = lena - lenb;
    // lena 第一个,lenb就是第i+1个,去比较是否相同,不相同就继续
    while(i--){
        ha = ha->next;
    }
    while(ha != nullptr){
        if(ha!=hb){
            ha = ha->next;
            hb = hb->next;
        }
        else{
            return ha;
        }
    }
}
return nullptr;

}

关键

最后一个如果一样,那就说明前面有相交节点,lena 第一个,lenb就是第i+1个,去比较是否相同,不相同就继续

标签:11.7,相交,next,链表,算法,hb,ha,节点
From: https://www.cnblogs.com/minipython-wldx/p/17814545.html

相关文章

  • 排序算法
    1.插入类排序1.1直接插入排序classSolution{publicvoidinsertSort(int[]arr,intn){inttmp;for(inti=1;i<n;i++){//将待插入的关键字暂存于tmp中tmp=arr[i];intj=i-1;/......
  • 商品sku算法
    笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尔积(Cartesianproduct),又称直积,表示为X×Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员实现简单的sku算法`constspec=[['红','白','蓝'],['32G','64G'],['移动','联通','电信']]......
  • 算法刷题记录-螺旋矩阵
    算法刷题记录-螺旋矩阵螺旋矩阵给你一个正整数n,生成一个包含1到n2所有元素,且元素按顺时针顺序螺旋排列的nxn正方形矩阵matrix。示例1:输入:n=3输出:[[1,2,3],[8,9,4],[7,6,5]]示例2:输入:n=1输出:[[1]]思路,这题有点绕,我用了一个比res大2的布尔矩阵来存储......
  • 算法--笔记--单调栈
    单调栈是为了解决两层foru循环O(n^2)变为O(n)的问题思路是:维持一个单调栈.依次进入单调栈,并淘汰对后续没有帮助的对象当一个对象从栈里弹出的时候,结算当前对象参与的答案。如何判断单调栈是大压小还是小压大呢?左侧的要小的,就是大压小左侧的要大的,就是小压大......
  • 文心一言 VS 讯飞星火 VS chatgpt (129)-- 算法导论11.1 4题
    四、用go语言,我们希望在一个非常大的数组上,通过利用直接寻址的方式来实现一个字典。开始时该数组中可能包含一些无用信息,但要对整个数组进行初始化是不太实际的,因为该数组的规模太大。请给出在大数组上实现直接寻址字典的方案。每个存储对象占用O(1)空间;SEARCH、INSERT和DELETE操......
  • 文心一言 VS 讯飞星火 VS chatgpt (129)-- 算法导论11.1 4题
    四、用go语言,我们希望在一个非常大的数组上,通过利用直接寻址的方式来实现一个字典。开始时该数组中可能包含一些无用信息,但要对整个数组进行初始化是不太实际的,因为该数组的规模太大。请给出在大数组上实现直接寻址字典的方案。每个存储对象占用O(1)空间;SEARCH、INSERT和DELETE操......
  • 羚通视频智能分析平台石油石化 视频监控识别漏油算法检测
    羚通视频智能分析平台是一款专为石油石化行业设计的高效工具,它能够通过先进的算法进行漏油检测。这款平台利用了人工智能和大数据技术,可以实时监控石油石化设施的运行状态,及时发现并预警可能的漏油风险。在石油石化行业中,漏油是一种常见的安全隐患,如果不及时处理,可能会对环境造成严......
  • 大二算法实验一用循环链表解决约瑟夫环
    题目约瑟夫(Joeph)问题的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的......
  • 数据结构与算法-数组
    什么是数组在每一种编程语言中,基本都会有数组这种数据类型。不过,它不仅仅是一种编程语言中的数据类型,还是一种最基础的数据结构是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据数组的特点低效的插入和删除数组为了保持内存数据的连续性,会导致插入......
  • 羚通视频智能分析平台玩手机、打电话算法检测识别系统 玩手机、打电话行为预警系统
    羚通视频智能分析平台是一款先进的技术工具,具备强大的算法检测和识别功能。该平台主要用于准确检测和识别用户是否在使用手机或打电话。首先,该平台具备强大的算法检测功能,能通过分析视频中的图像和声音数据,准确判断用户是否在使用手机。无论是滑动屏幕、点击按钮还是......