首页 > 其他分享 >【LeetCode链表#12】链表相交

【LeetCode链表#12】链表相交

时间:2023-01-20 17:11:06浏览次数:55  
标签:lenB 12 ListNode 节点 链表 curB curA LeetCode

链表相交

同:160.链表相交

力扣题目链接(opens new window)

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

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

img

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

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

示例 1:

img

示例 2:

img

示例 3:

imgimg

思路

根据LeetCode题目下的隐藏提示4以及观察可知:

如果两个链表存在相交部分,那么自相交点之后的节点应该都是重合的(下面的图没体现出来)

由此,我们可以将待判断的两个链表的尾部对齐

将较长链表的当前指针指向与短链表的对齐

面试题02.07.链表相交_2

从此处同时向后遍历,直到找到相同的节点

思路大概是这样的,那么关键要解决两个问题:

​ 1、如何找出较长的那个链表?

​ 2、如何尾部对齐?

因为我们有两个链表,那么先直接定义两个指针curA和curB,并且,curA一定是指向较长的那个链表的指针。

实际上第一个问题用遍历解决就行了,但是在过程中,万一最开始定义的链表并不是最长的,应该如何处理?例如curA实际上比curB短,这时需要将两者调换

调换过程也比较简单粗暴,当记录长度的变量显示curA比curB短后,将curA和curB交换就行(同时还要将长度变量互换)

这个时候,求出两链表的长度差,将curA移动到curB所在的位置,就能将尾部对齐

代码

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        //初始化两链表的头节点,默认A为较长的那个
        ListNode curA = headA;
        ListNode curB = headB;

        //用于记录链表长度
        int lenA = 0;
        int lenB = 0;

        //分别遍历获取两链表长度
        while(curA != null){
            lenA++;
            curA = curA.next;
        }

        while(curB != null){
            lenB++;
            curB = curB.next;
        }

        //遍历结束重新将指针放回头节点
        curA = headA;
        curB = headB;


        //如果lenB大,就要交换一下
        if(lenB > lenA){
            //交换节点
            ListNode tempN;
            tempN = curA;
            curA = curB;
            curB = tempN;

            //交换长度信息
            int tempL = lenA;
            lenA = lenB;
            lenB = tempL;
        }

        //尾部对齐
        //先计算长度差值
        int subResult = lenA - lenB;
        //移动指针对齐短链表
        while(subResult-- > 0){
            curA = curA.next;
        }

        //两链表同时向后遍历,遇到相同值便返回
        while(curA != null){
            if(curA == curB){
                return curB;//A、B都行
            }
            curA = curA.next;
            curB = curB.next;
        }
        return null;   
    }
}
易错点

1、统计完长度记得把指针调回链表头部

标签:lenB,12,ListNode,节点,链表,curB,curA,LeetCode
From: https://www.cnblogs.com/DAYceng/p/17062903.html

相关文章

  • LeetCode——刷题笔记二
         ......
  • LeetCode.202 快乐数
    1.题目编写一个算法来判断一个数n是不是快乐数。「快乐数」 定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为1,也......
  • 单向链表
    单向链表的方向是单向的,其节点是由一个数据域和一个指针域组成,每个指针域都指向下一个节点,最后一个节点的指针域为None代码实现:#-*-coding=utf-8-*-#......
  • 【DFS】LeetCode 951. 翻转等价二叉树
    题目链接951.翻转等价二叉树思路如果二叉树root1,root2根节点值相等,那么只需要检查他们的孩子是不是相等就可以了。如果root1或者root2是null,那么只有在他们都......
  • 代码随想录算法训练营day09 | leetcode 28. 实现 strStr()
    LeetCode28.实现strStr()牢记一点:next[i]元素表示【0,i】子串的最长相等前后缀个数,也是模式串与主串匹配不相等时模式串的下一个比较索引分析1.0前缀是指不包含最后......
  • 23/1/119-LeetCode 08:String to Integer (atoi)
    思路主要是对于前面的零,可以不用再去特殊判断了嘛。直接当成普通的数字直接算就好,反正算完之后ans=0,nodifference;对于超出范围,这个一直都是我不太注意的地方,这里max=2^......
  • Rocky Linux 9安装PostgreSQL 12和PostGIS
    一、安装和启用EPEL、CRB、PostgreSQL仓库dnf-yinstallepel-releasednf-yinstallhttps://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-red......
  • 【LeetCode链表#11】环形链表||(双指针)
    环形链表II力扣题目链接(opensnewwindow)题意:给定一个链表,返回链表开始入环的第一个节点。如果链表无环,则返回null。为了表示给定链表中的环,使用整数pos来表示链......
  • 【DFS】LeetCode 101. 对称二叉树
    题目链接101.对称二叉树思路DFS递归解决代码classSolution{publicbooleanisSymmetric(TreeNoderoot){if(root==null){returnt......
  • ASP.NET Core 实战-12.使用 Entity Framework Core 保存数据
    介绍EntityFrameworkCore数据库访问代码在Web应用程序中无处不在。无论您是构建电子商务应用程序、博客还是NextBigThing™,您都可能需要与数据库进行交互。不幸......