【刷题笔记8.15】【链表相关】LeetCode:合并两个有序链表、反转链表

news/2024/7/24 2:40:03 标签: 链表, leetcode, java

LeetCode:【链表相关】合并两个有序链表

题目1:合并两个有序链表

题目描述

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
在这里插入图片描述
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
示例 2:

输入:l1 = [], l2 = []
输出:[]
示例 3:

输入:l1 = [], l2 = [0]
输出:[0]

代码实现

此题没啥好说的,直接上代码,自己好好分析一下子

java">/**
 * 题目:合并两个有序链表
 * 输入:l1 = [1,2,4], l2 = [1,3,4]
 * 输出:[1,1,2,3,4,4]
 */
public class Solution {
    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        //注意:头节点存储的是-1,并且移动指针p指向头节点,头节点的next指针指向的才是合并后的第一个元素(****)
        ListNode result = new ListNode(-1);
        ListNode p = result;

        while (list1 != null && list2 != null) {
            if (list1.val <= list2.val) {
                p.next = list1;
                p = p.next;
                list1 = list1.next;
            } else {
                p.next = list2;
                p = p.next;
                list2 = list2.next;
            }
        }

        if (list1 == null) {
            p.next = list2;
        }
        if (list2 == null) {
            p.next = list1;
        }

        return result.next;
    }
}

题目2:反转链表

题目描述:

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表
在这里插入图片描述

分析

此题可以使用 头插法 实现

  • 使用栈实现(注意封尾操作)

  • 使用头插法(注意:头插法的第一步是记录head的next节点即 temp = head.next;)

代码实现

java">/**
 * 题目:反转链表
 * 输入:head = [1,2,3,4,5]
 * 输出:[5,4,3,2,1]
 */
public class Solution {
    //方法1:使用栈Stack实现
    public ListNode reverseList(ListNode head) {
        Stack<ListNode> stack = new Stack<>();
        ListNode newHead = new ListNode(-1);
        ListNode p = newHead;

        while (head != null) {
            stack.push(head);
            head = head.next;
        }

        while (!stack.isEmpty()) {
            p.next = stack.pop();
            p = p.next;
        }

        //注意:最后一定要将链表结束进行封尾操作,不然会报错(***)
        p.next = null;

        return newHead.next;
    }

    //方法2:使用头插法(头插法的关键第一步,记录head后面的节点即temp = head.next)
    public ListNode reverseList1(ListNode head) {
        ListNode newHead = null;

        while (head != null) {
            //1、首先,记录head后面的节点
            ListNode temp = head.next;

            //2、头插法:(1)先将head.next指向newHead (2)将newhead直接赋值为head的这样就实现了头插法
            head.next = newHead;
            newHead = head;

            //3、将head赋值为head后面的节点temp继续遍历
            head = temp;
        }
        //4、最后,返回newHead
        return newHead;
    }
}

http://www.niftyadmin.cn/n/4941472.html

相关文章

分布式文件系统(FastDFS)

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…

面试之快速学习STL- vector

1. vector底层实现机制刨析&#xff1a; 简述&#xff1a;使用三个迭代器表示的&#xff1a; &#xfffc; 这也就解释了&#xff0c;为什么 vector 容器在进行扩容后&#xff0c;与其相关的指针、引用以及迭代器可能会失效的原因。 insert 整体向后移 erase 整体向前移…

地理数据的双重呈现:GIS与数据可视化

前一篇文章带大家了解了GIS与三维GIS的关系&#xff0c;本文就GIS话题带大家一起探讨一下GIS和数据可视化之间的关系。 GIS&#xff08;地理信息系统&#xff09;和数据可视化在地理信息科学领域扮演着重要的角色&#xff0c;它们之间密切相关且相互增强。GIS是一种用于采集、…

云计算虚拟仿真实训平台

一、云计算虚拟仿真系统概述 云计算虚拟仿真系统是一种基于云计算技术和虚拟化技术的系统&#xff0c;用于实现各种仿真和模拟任务。它可以提供强大的计算能力和资源管理&#xff0c;为用户提供灵活、高效、可扩展的仿真环境。 该系统通常由一组服务器、网络和存储设备组成&am…

JVM——分代收集理论和垃圾回收算法

一、分代收集理论 1、三个假说 弱分代假说&#xff1a;绝大多数对象都是朝生夕灭的。 强分代假说&#xff1a;熬过越多次垃圾收集过程的对象越难以消亡。 这两个分代假说共同奠定了多款常用的垃圾收集器的一致的设计原则&#xff1a;收集器应该将Java堆划分出不同的区域&…

centos上下载redis

1.redis 特点 Redis特性&#xff08;8个&#xff09; 1 速度快&#xff1a;10w ops&#xff08;每秒10w读写&#xff09;&#xff0c;数据存在内存中&#xff0c;c语言实现&#xff0c;单线程模型 2 持久化&#xff1a;rdb和aof 3 多种数据结构&#xff1a; 5大数据结构 …

电子商务概述

科技管理涉及的领域很广泛&#xff0c;它是属于管理、工程、科学、法律、社会、 政策、经济等各个领域的一个整合。它所追求的目标是为相关科技管理问题提供最 好的解决方案。科技管理分为国家、产业、企业与个人四个层次。本文站在产业的 角度对电子商务的供应链管理中科技…

CompletableFuture异步任务编排

CompletableFuture异步任务编排 API supplyAsync&#xff1a; 异步执行任务&#xff0c;任务有返回值runAsync&#xff1a; 异步执行任务&#xff0c;无返回值 then* : 功能&#xff1a;前一个异步任务执行完&#xff0c;然后执行本任务当前执行thenApply()方法的线程来执行本…