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

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

相关推荐
Yeats_Liao6 小时前
MindSpore开发之路(八):数据处理之Dataset(上)——构建高效的数据流水线
数据结构·人工智能·python·机器学习·华为
客梦7 小时前
数据结构-线性表
数据结构·笔记
鹿角片ljp7 小时前
力扣226.翻转二叉树-递归
数据结构·算法·leetcode
WBluuue8 小时前
数据结构和算法:Morris遍历
数据结构·c++·算法
客梦8 小时前
数据结构-红黑树
数据结构·笔记
Sheep Shaun9 小时前
STL:string和vector
开发语言·数据结构·c++·算法·leetcode
winfield8219 小时前
滑动时间窗口,找一段区间中的最大值
数据结构·算法
k***921610 小时前
list 迭代器:C++ 容器封装的 “行为统一” 艺术
java·开发语言·数据结构·c++·算法·list
x70x8010 小时前
C++中auto的使用
开发语言·数据结构·c++·算法·深度优先
sin_hielo11 小时前
leetcode 2054(排序 + 单调栈,通用做法是 DP)
数据结构·算法·leetcode