一分钟解决数据结构问题---找出两个链表的第一个公共结点

此题为力扣链表题目:

📌 文章目录:

1️⃣.题目解析

2️⃣.代码实现

3️⃣.全部代码

题目:

在这里插入图片描述

1️⃣.题目解析

题目要求:两个相交的链表,找到两个链表相交的第一个公共交点,这道题需要定义两个结点类型变量,一个用于指向较长链表(pl),一个用于指向较短链表(ps),较长的 pl 先走两个链表长度的差值步,两个指针再同时走,直到相遇,返回相遇的那个结点

2️⃣.代码实现

步骤一、先判断两个链表是不是为空,如果有一个为空,链表无法相交,直接返回空对象

if (headA == null || headB == null){
            return null;
        }

步骤二、定义两个结点类型变量,pl 指向较长链表,ps 指向较短链表,这里先默认 A链表长

ListNode pl = headA;
ListNode ps = headB;

步骤三、计算两个链表长度,pl 和 ps 走完后要重新赋值

        int lenA = 0;
        int lenB = 0;
        while(pl != null){
            lenA++;
            pl = pl.next;
        }
        pl = headA;
        while(ps != null){
            lenB++;
            ps = ps.next;
        }
        ps = headB;

步骤四、计算两个链表长度的差值,判断保证差值大于 0,如果差值小于 0 ,证明 B 更长,交换 pl 和ps 的指向

        int len = lenA - lenB;
        if (len < 0){
            pl = headB;
            ps = headA;
            len = lenB - lenA;
        }

步骤五、指向长链表的 pl 多走差值步

while(len != 0){
            len--;
            pl = pl.next;
        }

步骤六、pl 和 ps 同时走,直到相遇
在这里插入图片描述

while(pl != ps){
            ps = ps.next;
            pl = pl.next;
        }

步骤七、判断两个链表有没有哪个走到了空,走到空,证明两个链表平行没有交点,题目中的这种情况
在这里插入图片描述

if (pl == null || ps == null){
            return null;
        }

步骤八、返回交点即可

return pl;

3️⃣.全部代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if (headA == null || headB == null){
            return null;
        }
        ListNode pl = headA;
        ListNode ps = headB;
        int lenA = 0;
        int lenB = 0;
        while(pl != null){
            lenA++;
            pl = pl.next;
        }
        pl = headA;
        while(ps != null){
            lenB++;
            ps = ps.next;
        }
        ps = headB;
        int len = lenA - lenB;
        if (len < 0){
            pl = headB;
            ps = headA;
            len = lenB - lenA;
        }
        while(len != 0){
            len--;
            pl = pl.next;
        }
        while(pl != ps){
            ps = ps.next;
            pl = pl.next;
        }
        if (pl == null || ps == null){
            return null;
        }
        return pl;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦の澜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值