【LeetCode】相交链表

本文探讨了链表相交问题的两种解决方案:通过构造环形链表寻找相交点和交替遍历方法。提供了详细的算法思路及实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#LeetCode每日一题【链表专题】

  • 相交链表
    https://leetcode-cn.com/problems/intersection-of-two-linked-lists/

  • 分析
    前面已经实现了环形链表,如何寻找入环的位置。这一道题可以看成是环形链表的衍生题,寻找链表相交的位置:

    1. 构造环形,headA一轮遍历,首尾相接入环
    2. 此时就是一个环形链表寻找入环位置的题:使用双指针,一快一慢相遇之后,重置慢指针到起点在重新同时出发,在相遇则为入环位置:详见:
      https://blog.youkuaiyun.com/shijiujiu33/article/details/122544237
    3. 需要注意的是,题目要求保持原链表结构不变,在找到相交位置之后,需要断环
  • 实现

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        // 寻找两个链表相遇的位置
        // 类似于环形链表,寻找入环的位置
        // 第一次遍历,将A链表成环;然后就是一道环形链表的问题
        // A一次走两步,B一次走一步;相遇之后,置其中一个为头节点,在同时走,再次相遇即为入环位置(相交位置)

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

        ListNode temp = headA;
        while (temp.next != null) {
            temp = temp.next;
        }
        temp.next = headA;

        ListNode left = headB, right = headB;
        while (right != null && right.next != null) {
            right = right.next.next;
            left = left.next;
            if (left == right) {
                break;
            }
        }
        left = headB;
        while (right != null && right.next != null) {
            if (left == right) {
                // 断环(保证原结构不变)
                temp.next = null;
                return left;
            }
            left = left.next;
            right = right.next;
        }
        // 断环(保证原结构不变)
        temp.next = null;
        return null;
    }

LeetCode耗时:1ms
在这里插入图片描述

  • 实现二
    交替遍历,headA遍历完之后,从headB开始遍历;同时headB遍历完之后,从headA开始遍历,则他们相遇的位置定为相交点:
    还是一道数学题
public ListNode getIntersectionNode02(ListNode headA, ListNode headB) {
        // 交替遍历,headA遍历完之后,从headB开始遍历;同时headB遍历完之后,从headA开始遍历,则他们相遇的位置定为相交点
        if (headA == null || headB == null) {
            return null;
        }
        ListNode tempA = headA, tempB = headB;
        // 没有相交点,则会在null=null相遇
        while (tempA != tempB) {
            tempA = tempA == null ? headB : tempA.next;
            tempB = tempB == null ? headA : tempB.next;
        }
        return tempA;
    }

LeetCode耗时:1ms
在这里插入图片描述

  • 总结
    善于将题目转换为自己熟悉的题型;
    相交的位置可以转换为找入环的位置;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值