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

LeetCode 160 Intersection Of Two Linked Lists 相交链表 Java

题目:找到两个相交列表的起始点,如图c1开始为A和B两个链表的相交点

举例1:8为两个链表的相交点。 注意:相交不止是数值上的相同。

举例2:2为相交点

举例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) {

        //将链表A与B分别放入栈A与B中
        Stack<ListNode> stackA = new Stack<>();
        while (headA != null) {
            stackA.push(headA);
            headA = headA.next;
        }
        Stack<ListNode> stackB = new Stack<>();
        while (headB != null) {
            stackB.push(headB);
            headB = headB.next;
        }


        //从链表的最后一个位置开始比较相同节点,相同的话放入新的栈中,不同的话结束比较
        Stack<ListNode> intersectStack = new Stack<>();
        while (!stackA.isEmpty() && !stackB.isEmpty()) {
            ListNode currectA = stackA.pop();
            ListNode currectB = stackB.pop();
            if (currectA == currectB) {
                intersectStack.push(currectA);
            } else {
                break;
            }
        }


        //将相交栈中的数据取出,重新拼成链表
        if (intersectStack.isEmpty()) {
            return null;
        }
        ListNode newHead = intersectStack.pop();
        ListNode currect = newHead;
        while (!intersectStack.isEmpty()) {
            currect.next = intersectStack.pop();
            currect = currect.next;
        }
        currect.next = null;
        return newHead;
    }
}


http://www.kler.cn/a/597043.html

相关文章:

  • 简单实用!百度AI + Raphael AI = 免费生图
  • 第十四届蓝桥杯省赛电子类单片机学习记录(客观题)
  • [笔记.AI]多头自注意力机制(Multi-Head Attention)
  • 计划变动的坐标系-基线
  • MyBatis-Plus 自动填充:优雅实现创建/更新时间自动更新!
  • SQL之delete、truncate和drop区别
  • JavaScript基础-DOM事件流
  • 【CSS文字渐变动画】
  • 在Mac M1/M2芯片上完美安装DeepCTR库:避坑指南与实战验证
  • OpenCV图像处理:分割、合并、打码、组合与边界填充
  • 一区思路!
  • Linux线程控制封装及线程互斥
  • MyBatis XML配置从零开始:高效处理数据库映射与查询!!!
  • C#基础学习(二)C#数组生存手册:从入门到“血压拉满“的奇妙旅程
  • 人工智能将使勒索软件更加危险
  • 【信息系统项目管理师】【论文分享】【历年真题】​论信息系统项目的成本管理
  • 数字电子技术(三十二)——组合逻辑电路的特点和基本设计方法
  • ubuntu22.04安装搜狗输入法保姆教程~
  • 考研课程安排(自用)
  • Flutter TextFormField 完全手册与设计最佳实践