【算法通关村第一关】链表经典问题

news2024/11/18 9:38:47

1.两个链表第一个公共子节点

1.这是一道经典的链表问题:输入两条链表,找出他们的第一个公共节点。

使用集合的方法:

public ListNode findFirstCommonNodeBySet(ListNode headA,ListNode headB){
   Set<ListNode> set = new HashSet<>();
   while(head != null){
       set.add(headA);
       headA = head.next;   
   }
   while(headB != null){
       if(set.contains(headB))
           return headB;
       headB = headB.next;                  
   }        
   return null;
}

使用栈的方法:

import java.util.Stack;
public ListNode findFirstCommonNodeByStack(ListNode headA,ListNode headB){
    Stack<ListNode> stackA = new Stack();
    Stack<ListNode> stackB = new Stack();
    while(headA!=null){
        stackA.push(headA);
        headA=headA.next;    
    }
    while(headB!=null){
        stackB.push(headB);
        headB = headB.next;    
    }
    ListNode preNode = null;
    while(stackB.size()>0 && stackA.size()>0){
        if(stackA.peek()==stackB.peek()){
            preNode=stackA.pop();
            stackB.pop();                    
        }else{
              break;      
        }
    }
    return preNode;
}

2.判断链表是否为回文序列

回文序列

一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列

{1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列,

{1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列。

public Boolean isPalindrome(ListNode head){
    ListNode temp = head;
    Stack<Integer> stack = new Stack();
    while(temp != null){
        stack.push(temp.val);
        temp = temp.next;    
    }
    while(head != null){
        if(head.val != stack.pop()){
            return false;        
        }    
        head = head.next;
    }
    return true;
}

3.合并有序链表

public ListNode mergeTwoLists(ListNode list1,ListNode list2){
    ListNode newHead = new ListNode(-1);
    ListNode res = newHead;//头节点不能用,通过一个辅助指针来遍历
    //情况一:都不为空
    while(list1!=null||list2!=null){
        if(list1!=null&&list2!=null){
            if(list1.val<list2.val){
                newHead.next = list1; 
                list1 = list1.next;       
            }else if(list1.val>list2.val){
                newHead.next = list2;
                list2 = list2.next;
            }else{
                //相等的情况
                newHead.next = list2;
                list2 =list2.next;
                newHead = newHead.next;
                newHead.next = list1;
                list1 = list1.next;                    
            }
            newHead = newHead.next;
        //有一个链表不为空
        else if(list1!=null&&list2==null){
            newHead.next = list1;
            list1 = list1.next;
            newHead = newHead.next;        
        }else if(list1==null&&list2!=null){
            newHead.next=list2;
            list2=list2.next;
            newHead=newHead.next;        
        }
    }
    return res.next;
}

优化:

public LIstNode mergeTwoLists(ListNode list1,ListNode list2){
    ListNode prehead = new ListNode(-1);
    ListNode prev = prehead;
    while(list != null && list2 != null){
        if(list1.val<=list2.val){
            prev.next = list1;
            list1 = list1.next;        
        }else{
            prev.next = list2;
            list2 = list2.next;        
        }
        prev = prev.next;
    }
    //最多只有一个还未被合并完,直接接上去就行了,这是链表合并比数组合并方便的地方
       prev.next = list1 == null ? list2 : list1;
       return prehead.next;
   }

合并K个链表

先将前两个合并,之后再将后面的逐步合并进来,这样的好处是只要将前两个写清楚就行

public ListNode mergeKLists(ListNode[] lists){
    ListNode res = null;
    for(ListNoe list:lists){
        res = mergeTwoLists(res,list);    
    }
    return res;
}

给你两个链表list1和list2,他们包含的元素分别为n个和m个。请你将list1中下标从a到b的几点删除,并将list2接在被删除的节点的位置。

public List mergeInBetween(ListNode list1,int a,int b,ListNode list2){
    ListNode pre1 = list1,post1 = list1,post2=list2;
    int i = 0,j = 0;
    while(pre1 != null && post1 != null && j<b){
        if(i != a-1) {
            pre1 = pre1.next;
            i++;        
        } 
        if(j != b){
            post1 = post1.next;
            j++;        
        } 
    }
    post1 = post1.next;
    while(post2.next != null){
        post2 = post2.next;            
    }
    //链1尾接链2头,链2尾接链1后半部分的头
    pre1.next = list2;
    post2.next = post1;
    return list1;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1155613.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux服务器部署带Cplex的Java项目

Linux版Cplex安装 Cplex安装包 Cplex 22.1.0 Linux安装包 安装步骤 找到安装包的路径 [roothecs-327697 ~]# cd /www/cplex [roothecs-327697 cplex]# ls cplex_studio2210.linux_x86_64.bin使用chmod 777赋予安装包读、写、执行权限&#xff0c;使用./执行安装 [roothec…

数字IC前端学习笔记:数字乘法器的优化设计(基4布斯编码华莱士树乘法器)

相关阅读 数字IC前端https://blog.csdn.net/weixin_45791458/category_12173698.html?spm1001.2014.3001.5482 使用基2布斯乘法器虽然能减少乘数中0的数量&#xff0c;但最终还是无法减少部分积的数量&#xff0c;因此一种更合理的编码方式产生了——基4布斯编码。它可以将部…

LeetCode刷题---简单组(六)

文章目录 &#x1f352;题目一 69. x 的平方根&#x1f352;解法一&#x1f352;解法二&#x1f352;题目二 70. 爬楼梯&#x1f352;解法一 &#x1f352;题目一 69. x 的平方根 &#x1f352;解法一 class Solution(object):def mySqrt(self, x):""":type x:…

皮肤渲染方法总结

一、皮肤次表面光照 HDRP用的延迟管线&#xff0c;镜面和散射分开进行计算 UE有透射开启和关闭的效果 &#xff08;一&#xff09;镜面反射 BRDF和Kelemen方法 &#xff08;二&#xff09;次表面散射与透射 1.散射&#xff1a;BRDF与BRSSDF&#xff08;从反射点附近的点进行…

基于springboot框架的房屋租赁租房系统

功能如图所示 摘要 房屋租赁租房系统是一个基于Spring Boot框架开发的全新房地产管理平台&#xff0c;它旨在简化租房流程&#xff0c;提供房东和租户之间的高效互动&#xff0c;以满足现代社会对房屋租赁的不断增长的需求。该系统充分利用了Spring Boot的强大特性&#xff0c;…

电源控制系统架构(PCSA)之电源管理软件

下图显示了电源管理软件栈的简化表示。该图说明了OS电源管理框架、具有直接从SCP请求操作功能的组件以及它们与SCP固件之间的关系。 一个重要的方面是&#xff0c;所有硬件电源管理操作都是由SCP代表这些请求者执行的。 这种OS电源管理(OSPM)的简化表示可以分为两部分&#xff…

[NSSRound#6 Team]check(Revenge)

文章目录 考点tarfile文件覆盖漏洞&#xff08;CVE-2007-4559&#xff09;PIN码计算 解题过程非预期解预期解 考点 tarfile文件覆盖漏洞&#xff08;CVE-2007-4559&#xff09; Python 中 tarfile 模块中的extract、extractFile和extractall 函数中的目录遍历漏洞 允许 用户协…

点云配准--对称式ICP

对称式ICP 写在前面的话 针对于局部平面不完美的情况&#xff0c;提出了一种对称式ICP目标函数&#xff0c;相较于传统的ICP方法&#xff0c;增大了收敛域&#xff0c;提高了收敛速度。论文理论说明不甚清楚&#xff0c;实验较少&#xff0c;但代码开源。 理论 对称目标函数…

【Simulink】飞轮储能系统的建模与MATLAB仿真(永磁同步电机作为飞轮驱动电机)

目录 ​1 主要内容 2 结果分析 3 程序链接 ​1 主要内容 该仿真为飞轮储能系统的建模&#xff0c;包括电网侧和电机侧两部分模型&#xff0c;仿真采用永磁同步电机作为飞轮驱动电机&#xff0c;通过矢量控制的方式对其发电和电动的工况进行控制&#xff0c;同时&#xff0c…

数据库访问跳板机

应用场景 在安全性要求高的网络环境&#xff0c;可能会出现数据库ip访问限制&#xff0c;导致数据库只有指定服务器才能访问&#xff0c;在特定业务场景我们可能会经常多人查询该数据库的表&#xff0c;为了解决这个问题&#xff0c;我写了一个小工具。 核心思想 解决方案实…

WindowsTerminal 配置标签页(快速使用PowerCli)

需求 避免每次都需要手动输入密码、手动填写信息才能访问vcenter。结合WindowsTerminal快速创建标签页&#xff0c;需要时一键开启Powercli。 解决 编写启动PowerCli的bat脚本 内容如下 echo off powershell -NoExit -ExecutionPolicy Bypass -Command "Connect-VISe…

NLP之LSTM原理剖析

文章目录 背景simpleRNN的局限性 LSTM手写一下sigmoid例子支持长记忆的神经网络解读3重门 背景 SimpleRNN有一定局限性&#xff0c; 图片上的文字内容: 图片标题提到“SimpleRNN是一种基础模型。它用于解决序列型问题&#xff0c;其中的每一步的输出会影响到下一步的结果。图…

[计算机提升] 查看系统软件

3.1 查看系统软件 此处系统软件为系统安装后自带的一些软件、工具等。包括&#xff1a;管理工具、系统工具、轻松使用工具、附件等。 方法一&#xff1a;通过菜单打开系统软件 1、点击左下角windows菜单键&#xff0c;在弹出的菜单中&#xff0c;任一点击一个字母(示例中为C)&…

听GPT 讲Rust源代码--library/std(10)

题图来自 Rust Development Roadmap[1] File: rust/library/std/src/sys/windows/c.rs 在Rust源代码的rust/library/std/src/sys/windows/c.rs文件中&#xff0c;主要定义了Rust对于Windows操作系统的系统调用接口。该文件定义了各种Windows特定的结构体、枚举和常量&#xff0…

NAS(qnap)中安装git服务(gogs),硬件为TS-453Bmini,固件版本:QTS 5.1.2.2533

NAS(qnap)中安装git服务(gogs)&#xff0c;硬件为TS-453Bmini&#xff0c;固件版本&#xff1a;QTS 5.1.2.2533 1.进入nas的管理界面&#xff0c;找到App Center: 2.在AppCenter中&#xff0c;安装ContainerStation容器工作站&#xff1a; 3.ContainerStation容器工作站中&…

linux驱动开发环境搭建

使用的是parallel 创建的ubuntu 16.04 ubuntu20.04虚拟机 源码准备 # 先查看本机版本 $ uname -r 5.15.0-86-generic# 搜索相关源码 $ sudo apt-cache search linux-source [sudo] password for showme: linux-source - Linux kernel source with Ubuntu patches linux-sourc…

【Kubernetes 基本概念】Kubernetes 的架构和核心概念

目录 一、Kurbernetes1.1 简介1.2 为什么要用K8s?1.3 K8s的特性 二、Kurbernetes集群架构与组件三、Kurbernetes的核心组件3.1 Master组件3.1.1 Kube-apiserver3.1.2 Kube-controller-manager3.1.3 Kube-scheduler 3.2 配置存储中心——etcd3.3 Node组件3.3.1 Kubelet3.3.2 Ku…

qnx resource managers 实例

文章目录 前言一、resource managers 是什么二、device resource managers 实例1. Single-threaded device resource manager2.Multithreaded device resource manager3.Resource Managers that Handle Multiple Devices总结参考资料前言 本文主要介绍如何编写一个 qnx 下 的 …

CSS图片下方4px间距

目录 1&#xff0c;问题表现2&#xff0c;问题解决 1&#xff0c;问题表现 .test-img {height: 100px;outline: 1px solid salmon; }图片下方有4px间距。 图片下方是图片时问题也存在。 2&#xff0c;问题解决 图片设置 display: block;图片设置 vertical-align: middle; …

【Java 进阶篇】深入理解 Java Response:从基础到高级

HTTP响应&#xff08;Response&#xff09;是Web开发中的一个关键概念&#xff0c;它是服务器向客户端&#xff08;通常是浏览器&#xff09;返回数据的方式。理解如何在Java中处理和构建HTTP响应是开发Web应用程序的重要一部分。本文将从基础知识到高级技巧&#xff0c;详细介…