代码随想录刷题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.本题思路

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

相关推荐
-To be number.wan5 小时前
B 树 vs B+ 树:为什么 MySQL 用 B+ 树,而不是 B 树?
数据结构
杨间6 小时前
《排序算法全解析:从基础到优化,一文吃透八大排序!》
c语言·数据结构·排序算法
Remember_9936 小时前
【LeetCode精选算法】滑动窗口专题二
java·开发语言·数据结构·算法·leetcode
Gorgous—l6 小时前
数据结构算法学习:LeetCode热题100-动态规划篇(下)(单词拆分、最长递增子序列、乘积最大子数组、分割等和子集、最长有效括号)
数据结构·学习·算法
Remember_9937 小时前
【LeetCode精选算法】滑动窗口专题一
java·数据结构·算法·leetcode·哈希算法
Lueeee.8 小时前
v4l2驱动开发
数据结构·驱动开发·b树
漫随流水8 小时前
leetcode回溯算法(77.组合)
数据结构·算法·leetcode·回溯算法
超级大福宝9 小时前
【力扣200. 岛屿数量】的一种错误解法(BFS)
数据结构·c++·算法·leetcode·广度优先
iAkuya11 小时前
(leetcode)力扣100 46二叉树展开为链表(递归||迭代||右子树的前置节点)
windows·leetcode·链表
一分之二~13 小时前
回溯算法--解数独
开发语言·数据结构·c++·算法·leetcode