剑指offer题目详细版本(1)

简介: 剑指offer题目详细版本(1)

一、链表题目


1、从尾到头打印链表


  • 使用栈(也可以使用数组,逆序输出)


/**
*    public class ListNode {
*        int val;
*        ListNode next = null;
*
*        ListNode(int val) {
*            this.val = val;
*        }
*    }
*
*/
import java.util.Stack;
import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ArrayList<Integer> list = new ArrayList<>();
        Stack<ListNode> stack = new Stack<>();
        while(listNode!=null){
            stack.push(listNode);
            listNode = listNode.next;
        }
        while(!stack.isEmpty()){
            list.add(stack.pop().val);
        }
        return list;
    }
}


  • 反转链表再打印

关键点:要注意画图

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
         ArrayList<Integer> list = new ArrayList<>();
        ListNode pre = null;   // 定义前驱节点
        ListNode cur = listNode; // 定义当前节点 
        while(cur!=null){
            ListNode next = cur.next;  // 定义后继节点
            cur.next = pre;   
            pre = cur;
            cur = next;
        }
        ListNode head = pre;
        while(head!=null){
            list.add(head.val);
            head = head.next;
        }
        return list;
    }
}


  • 递归打印链表

递归到链表的尾部,再依次将链表结点存入数组中

算法实现:

变量:先创建一个list数组

递归结束条件:当链表结点为null,listNode==null。

结果:list即为逆序排列链表数值后的数组


image.png


import java.util.ArrayList;
public class Solution {
    ArrayList<Integer> list = new ArrayList<>();
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        if(listNode!=null){
            printListFromTailToHead(listNode.next);
            list.add(listNode.val);
        }
        return list;
    }
}


2、反转链表

通过三个指针轮流交替 的迭代方法


public class Solution {
    public ListNode ReverseList(ListNode head) {
        if(head==null || head.next == null){
           return head;
        }
        ListNode pre = null;
        ListNode cur = head;
        while(cur!=null){
            ListNode next = cur.next;
            cur.next = pre;
            pre = cur;
            cur = next;
        }
        return pre;
    }
}


迭代方法


微信图片_20220129163834.gif


/**
     *递归实现单链表反转
     * @param list 为传入的单链表
     */
    public static Node recursiveList(Node list){
        // 如果链表为空 或者 链表中只有一个节点,直接返回
        // 也是递归结束的条件
        if (list == null || list.next == null) return list;
        Node recursive = recursiveList(list.next);
        // 将 list.next.next 指针指向当前链表 list
        list.next.next = list ;
        // 将 list.next 指针指向 null
        list.next = null;
        // 返回反转之后的链表 recursive
        return recursive;
    }


3、合并两个排序的链表

非递归 版本


/*
public class ListNode {
    int val;
    ListNode next = null;
    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode Merge(ListNode list1,ListNode list2) {
        ListNode newHead = new ListNode(0);
        ListNode result = newHead;
        while(list1!=null&&list2!=null){
            if(list1.val>=list2.val){
                newHead.next = list2;
                list2 = list2.next;
            }else{
                newHead.next = list1;
                list1 = list1.next;
            }
            newHead = newHead.next;
        }
        if(list1!=null){
            newHead.next = list1;
        }
        if(list2!=null){
            newHead.next = list2;
        }
        return result.next;
    }
}
目录
相关文章
|
6月前
|
机器学习/深度学习 数据采集 算法
基于MobileNet深度学习网络的MQAM调制类型识别matlab仿真
本项目基于Matlab2022a实现MQAM调制类型识别,使用MobileNet深度学习网络。完整程序运行效果无水印,核心代码含详细中文注释和操作视频。MQAM调制在无线通信中至关重要,MobileNet以其轻量化、高效性适合资源受限环境。通过数据预处理、网络训练与优化,确保高识别准确率并降低计算复杂度,为频谱监测、信号解调等提供支持。
|
7月前
|
人工智能 Prometheus 监控
容器化AI模型的监控与治理:确保模型持续稳定运行
在前几篇文章中,我们探讨了AI模型的容器化部署及构建容器化机器学习流水线。然而,将模型部署到生产环境只是第一步,更重要的是确保其持续稳定运行并保持性能。为此,必须关注容器化AI模型的监控与治理。 监控和治理至关重要,因为AI模型在生产环境中面临数据漂移、概念漂移、模型退化和安全风险等挑战。全面的监控涵盖模型性能、数据质量、解释性、安全性和版本管理等方面。使用Prometheus和Grafana可有效监控性能指标,而遵循模型治理最佳实践(如建立治理框架、定期评估、持续改进和加强安全)则能进一步提升模型的可信度和可靠性。总之,容器化AI模型的监控与治理是确保其长期稳定运行的关键。
|
7月前
|
存储 关系型数据库 分布式数据库
PolarDB开源数据库进阶课16 接入PostGIS全功能及应用举例
本文介绍了如何在PolarDB数据库中接入PostGIS插件全功能,实现地理空间数据处理。此外,文章还提供了使用PostGIS生成泰森多边形(Voronoi diagram)的具体示例,帮助用户理解其应用场景及操作方法。
296 1
|
缓存 Java
JDK序列化原理问题之Fury如何实现与JDK序列化100%兼容的如何解决
JDK序列化原理问题之Fury如何实现与JDK序列化100%兼容的如何解决
202 0
|
10月前
|
安全 IDE Swift
探索iOS开发之旅:从初学者到专家
在这篇文章中,我们将一起踏上iOS开发的旅程,从基础概念的理解到深入掌握核心技术。无论你是编程新手还是希望提升技能的开发者,这里都有你需要的指南和启示。我们将通过实际案例和代码示例,展示如何构建一个功能齐全的iOS应用。准备好了吗?让我们一起开始吧!
|
12月前
|
消息中间件 Kafka 搜索推荐
|
12月前
|
关系型数据库 分布式数据库 PolarDB
PolarDB Ganos的实时时空计算
PolarDB是阿里云自主研发的云原生关系型数据库,提供极致弹性、高性能、海量存储及安全可靠的数据库服务。PolarDB PostgreSQL版100%兼容PostgreSQL和Oracle语法,集成Ganos——新一代云原生时空数据库引擎,具备几何、栅格、轨迹等十大核心引擎能力,支持物理世界时空多模数据的混合存储与分析。本文介绍的Ganos实时电子围栏计算基于PolarDB PostgreSQL版,适用于交通物流、禁飞区管理、营销等多种场景,通过Flink实时计算实现高效的空间数据处理。
147 1
|
自然语言处理 算法 IDE
求职季来了,让通义灵码陪你高效备战
技术岗面试有方法:用通义灵码提升编程实战能力。通义灵码作为智能编码助手,在求职时也可以成为程序员的“冲刺搭子”,提供精选面试模拟题、精准解析编程难题、秒速生成高效代码、优化算法思维等,从理论到实战,帮助开发者提升面试表现,快来体验吧,还有万份大礼等你赢取哦~
19013 10
|
算法 调度 SoC
电动汽车充放电V2G模型(Matlab代码)
电动汽车充放电V2G模型(Matlab代码)
|
人工智能 自然语言处理 供应链
想拥抱新智能?不妨看看这家高速增长企业的AI创新实践
想拥抱新智能?不妨看看这家高速增长企业的AI创新实践