剑指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;
    }
}
目录
相关文章
|
存储 JSON 前端开发
菜鸟之路Day39一一登录
本文介绍了登录功能的实现及其相关技术细节,包括会话管理、令牌认证和异常处理等内容。作者通过 Java 实现了一个基于用户名和密码的登录接口,调用服务层和数据库层完成用户验证。同时,文章深入探讨了三种会话跟踪技术:Cookie、Session 和 JWT 令牌。 在 JWT 部分,详细讲解了其生成与校验流程,实现了登录成功后返回 JWT 令牌的功能。此外,文章还介绍了过滤器(Filter)和拦截器(Interceptor)的概念及应用,演示了如何利用它们实现登录校验。 最后,为解决前后端交互中异常响应不统一的问题,定义了一个全局异常处理器 将系统异常以统一的 JSON 格式返回给前端。
414 0
|
8月前
|
监控 数据可视化 安全
智慧社区可视化大屏原型(Axure)设计
本文以“金潭智慧社区”为例,探讨基于Axure的智慧社区可视化大屏原型设计。通过数据整合与可视化技术,实现社区总览、实时监控、房价收入统计等多维度信息展示,提升管理效率与居民生活质量。
370 0
|
Java 物联网 C#
C#/.NET/.NET Core学习路线集合,学习不迷路!
C#/.NET/.NET Core学习路线集合,学习不迷路!
832 0
|
机器学习/深度学习 分布式计算 算法
【算法工程师】成为一名优秀的机器学习算法工程师所需知识及资料汇总-附思维导图
成为一名优秀的机器学习算法工程师所需要具备的技能和知识,包括理论基础、数学能力、编程技能、实践经验以及对特定领域的深入了解,并提供了学习资源和面试准备建议。
1325 3
【算法工程师】成为一名优秀的机器学习算法工程师所需知识及资料汇总-附思维导图
|
人工智能 智能设计 监控
2024《云计算&AI设计标准研讨会》全记录
2024《云计算&AI设计标准研讨会》全记录
|
人工智能 知识图谱
SVFR:全能视频人脸修复框架,支持提升清晰度、色彩填充和缺失补全等图像修复任务
SVFR 是一个通用视频人脸修复框架,支持人脸修复、着色和修复任务,基于 Stable Video Diffusion 技术,提供高质量的视频修复效果。
1265 23
SVFR:全能视频人脸修复框架,支持提升清晰度、色彩填充和缺失补全等图像修复任务
|
数据采集 人工智能 搜索推荐
SocraticLM:通过 AI 提问引导学生主动思考,中科大与科大讯飞联合推出苏格拉底式教育大模型
SocraticLM 是由中科大和科大讯飞联合开发的苏格拉底式教学大模型,通过提问引导学生主动思考,提供个性化教学,显著提升教学效果。
1506 9
SocraticLM:通过 AI 提问引导学生主动思考,中科大与科大讯飞联合推出苏格拉底式教育大模型
|
人工智能 编解码 API
刚刚,通义万相模型能力重磅升级!
刚刚,通义万相模型能力重磅升级!
|
存储 人工智能 缓存
【AI系统】Ascend C 语法扩展
Ascend C 是基于标准 C++ 扩展的编程语言,专为华为昇腾处理器设计。本文介绍了 Ascend C 的基础语法扩展、API(基础与高阶)、关键编程对象(数据存储、任务间通信与同步、资源管理及临时变量),以及如何利用这些特性高效开发。通过华为自研的毕昇编译器,Ascend C 实现了主机与设备侧的独立执行能力,支持不同地址空间的访问。API 包括计算、数据搬运、内存管理和任务同步等功能,旨在帮助开发者构建高性能的 AI 应用。
705 2
【AI系统】Ascend C 语法扩展