代码随想录刷题day14(2)|(链表篇)02.07. 链表相交(疑点)

目录

一、链表理论基础

二、链表相交求解思路

三、相关算法题目

四、疑点


一、链表理论基础

代码随想录

二、链表相交求解思路

链表相交时,是结点的位置,也就是指针相同,不是结点的数值相同;

思路:定义两个指针currA和currB,分别指向链表A和链表B的头节点,求出两个链表的长度lenA和lenB;

如果lenB>lenA,交换currA和currB的指向,即让currA指向链表B,让currB指向链表A,同时交换lenA和lenB,让lenA保存较长的链表(链表B)的长度,lenB保存链表A的长度,就是currA和lenA是对应的,让其表示较长的链表;currB和lenB是对应的,让其表示较短的链表,但是不一定和headA和headB是对应的;

求出两个链表的长度差gap,然后让较长链表移动到 和较短链表 同长度的位置,此时,同时移动currA和currB 并进行比较,如果不相等,则依次往后移动,如果相等,则认为此处为链表相交的开始结点,返回该位置即可;否则返回null;

注意⚠️:求完两个链表长度后,currA和currB此时指向为空,应该重新初始化;

三、相关算法题目

面试题目02.07. 链表相交

面试题 02.07. 链表相交 - 力扣(LeetCode)

java 复制代码
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode currA = headA;
        ListNode currB = headB;
        int lenA = 0;
        int lenB = 0;
        while(currA != null){
            //求链表A的长度
            lenA++;
            currA = currA.next;
        }
        while(currB != null){
            //求链表B的长度
            lenB++;
            currB = currB.next;
        }
        //★容易忘记 求完长度以后 currA和currB 指向为空 需要重新赋值头节点
        currA = headA;
        currB = headB;
        if(lenB > lenA){
            int temp = lenA;
            lenA = lenB;
            lenB = temp;
            currA = headB;
            currB = headA;
            //就是让currA 和 lenA 指向长度更长的那个链表 headA 还是 headB 无所谓
        }
        int gap = lenA - lenB;//求解两个链表长度之差
        while(gap != 0){
            gap--;
            currA = currA.next;
            //让更长的链表 移动到和较短链表同长度的位置 
        }
        while(currA != null){
            if(currA == currB){
                return currA;
            }
            currA = currA.next;
            currB = currB.next;
        }
        return null;
    }
}

四、疑点

1.最后相同位置判断链表A和链表B时,为什么只要有一个指针相同,后面的就不用判断了?(会不会 只有这一个相同,后面的又有不同的)

A:不会,当有一个指针的指向相同时,由于链表中指针域部分只有一个指针,所以之后必定也是一样的,链表相交以后就不会再分开成两个不同的链表;

2.法2同时移动链表的思路不太懂

3.让长链表移动到较短链表相同位置

4.本题思路

因为链表相交以后,说明两个链表共享同一个链表,那么相交部分的长度一定是≤ 俩链表中较短的链表,所以开始相交的部分最长也就是从较短链表的头结点开始,故本题思路 让长链表移动到和较短链表同长度的位置再开始比较;

相关推荐
㓗冽6 分钟前
8皇后·改-进阶题16
数据结构
x_xbx30 分钟前
LeetCode:148. 排序链表
算法·leetcode·链表
月落归舟2 小时前
帮你从算法的角度来认识数组------( 二 )
数据结构·算法·数组
Wave8454 小时前
数据结构—树
数据结构
ic爱吃蓝莓4 小时前
数据结构 | HashMap原理
数据结构·学习·算法·链表·哈希算法
灰色小旋风4 小时前
力扣21 合并两个有序链表(C++)
c++·leetcode·链表
liuyao_xianhui6 小时前
优选算法_分治_快速排序_归并排序_C++
开发语言·数据结构·c++·算法·leetcode·排序算法·动态规划
CryptoPP6 小时前
开发者指南:构建实时期货黄金数据监控系统
大数据·数据结构·笔记·金融·区块链
月落归舟7 小时前
每日算法题 14---14.环形链表
数据结构·算法·链表
光电笑映8 小时前
STL 源码解剖系列:map/set 的底层复用与红黑树封装
c语言·数据结构·c++·算法