当前位置: 首页 > news >正文

双链表找相交结点

思路:

  1. 遍历两个双链表,分别求出它们的长度(节点数)。
  2. 如果两个链表相交,它们在交点之后的部分长度应该是一样的。因此,可以计算出两个链表的长度差(如果有的话),并且让较长的链表先向前移动长度差个结点,使得它们处于相同的长度上。
  3. 接下来,同时遍历两个链表,比较它们的结点是否相同。当找到第一个相同的结点时,即为相交结点。
  4. 如果两个链表不相交,它们将在尾部同时到达 null,此时可以返回 null 表示没有相交结点。

实现上述思路:

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;

class ListNode {
    int val;
    ListNode next;

    ListNode(int val) {
        this.val = val;
        this.next = null;
    }
}

public class IntersectionOfTwoLinkedLists {
    // 查找相交结点的方法
    public ListNode findIntersection(ListNode headA, ListNode headB) {
        int lenA = getLength(headA);
        int lenB = getLength(headB);

        // 将较长链表前移,使它们处于相同长度上
        while (lenA > lenB) {
            headA = headA.next;
            lenA--;
        }

        while (lenB > lenA) {
            headB = headB.next;
            lenB--;
        }

        // 同时遍历链表,找到第一个相交结点
        while (headA != null && headB != null) {
            if (headA == headB) {
                return headA;
            }
            headA = headA.next;
            headB = headB.next;
        }

        return null;
    }

    // 辅助方法:计算链表长度
    private int getLength(ListNode head) {
        int length = 0;
        while (head != null) {
            length++;
            head = head.next;
        }
        return length;
    }

    // 单元测试
    @Test
    public void testFindIntersection() {
        // 创建两个链表
        ListNode commonNode = new ListNode(4);
        commonNode.next = new ListNode(5);

        ListNode headA = new ListNode(1);
        headA.next = new ListNode(2);
        headA.next.next = commonNode;

        ListNode headB = new ListNode(3);
        headB.next = commonNode;

        IntersectionOfTwoLinkedLists solution = new IntersectionOfTwoLinkedLists();

        // 测试方法
        ListNode intersection = solution.findIntersection(headA, headB);

        // 验证结果
        assertEquals(4, intersection.val);
    }
}

相关文章:

  • 1-多媒体通信概述
  • 274. H 指数
  • 计算机网络【CN】IPV4报文格式
  • 升级 Xcode 15模拟器 iOS 17.0 Simulator(21A328) 下载失败
  • 【LeetCode】1423 可获得的最大点数(中等题)
  • 鸡尾酒学习——沧海桑田
  • 回溯法:雀魂启动!
  • Go并发:使用sync.Pool来性能优化
  • leetcode_39 组合总和
  • 重入漏洞EtherStore
  • VSCode 开发 Vue 语法提示
  • python版opencv人脸训练与人脸识别
  • 【Matlab2016】Matlab中文版的下载、安装、激活(不建议安装过高版本!!)
  • 如何创建加载项(1)
  • Git总结
  • 2016年亚太杯APMCM数学建模大赛C题影视评价与定制求解全过程文档及程序
  • WinDbg 远程调试遇到IP为:169.254.xx.xx 的处理
  • 【Linux】操作系统以及虚拟机的安装与配置
  • 容联七陌百度营销通BCP解决方案,让营销更精准
  • 【Linux】【驱动】设备树中设备节点的挂载
  • 保利发展前4个月销售额约876亿元,单月斥资128亿元获4个项目
  • 两次蹚入同一条河,巴萨这一晚被命运抛弃
  • 青年与城市共成长,第六届上海创新创业青年50人论坛将举办
  • 演员扎堆音乐节,是丰富了舞台还是流量自嗨?
  • 击败老对手韩国队夺冠!国羽第14次问鼎苏迪曼杯创历史
  • 成为中国骑手“孵化器”,环球马术冠军赛是最好的历练舞台