链表双指针经典习题

链表双指针经典习题

  • 链表的分解
    • 删除排序链表中的重复元素2(重复元素彻底删除)
      • 方法一:分解链表
      • 方式二:快慢指针
      • 递归解法
  • 链表的合并
    • 丑数2
    • 有序矩阵中第k小的元素
    • 查找和最小的k对数字
    • 两数相加
    • 两数相加2
  • 回文单链表
    • 回文链表
  • 迭代和递归翻转单链表
    • 反转链表
      • 方一:迭代
      • 方二: 递归

链表的分解

删除排序链表中的重复元素2(重复元素彻底删除)

链接
在这里插入图片描述

方法一:分解链表

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {//1.分解链表 方式public ListNode deleteDuplicates(ListNode head) {ListNode uniqueDummy = new ListNode(101);ListNode repeatDummy = new ListNode(101);ListNode res=uniqueDummy;ListNode cur=head;//遍历原链表while(cur!=null){//cur节点是重复节点if(cur.next!=null && cur.val==cur.next.val || cur.val==repeatDummy.val){repeatDummy.next=cur;repeatDummy=repeatDummy.next;}else{//cur不是重复节点uniqueDummy.next=cur;uniqueDummy=uniqueDummy.next;}cur=cur.next;}uniqueDummy.next=null;return res.next;}
}

方式二:快慢指针


class Solution {//快慢指针方法,快指针探路 慢指针更新答案链表public ListNode deleteDuplicates(ListNode head) {ListNode dummy = new ListNode(101);dummy.next=head;ListNode slow=dummy;ListNode preFast=dummy;ListNode fast=head;while(fast!=null){if(fast.next!=null && fast.val!=preFast.val && fast.val!=fast.next.val){//fast节点不重复slow.next=fast;slow=slow.next;}if(fast.next==null && fast.val!=preFast.val){slow.next=fast;slow=slow.next;}fast=fast.next;preFast=preFast.next;}slow.next=null;return dummy.next;}
}

递归解法

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {//递归解法//定义:给你一条头结点是head的链表 删除重复元素后返回头结点public ListNode deleteDuplicates(ListNode head) {//如果 只有一个节点 或者没有节点 就不用删除if(head==null || head.next==null){return head;}//如果head节点与后面的节点不同if(head.val!=head.next.val){head.next= deleteDuplicates(head.next);return head;}//如果head节点与后面的节点相同while(head.next!=null && head.val==head.next.val){head=head.next;}return deleteDuplicates(head.next);}
}

链表的合并

丑数2

链接在这里插入图片描述

class Solution {public int nthUglyNumber(int n) {int p2=1,p3=1,p5=1;//指向ugly中的第一个丑数int val2=1,val3=1,val5=1;//表示三个链表的当前节点int p=1;//指向ugly的索引,便于更新uglyint[]ugly=new int[n+1];//ugly[i]:第i个丑数while(p<=n){//找出三个链表中当前节点的最小值int minVal=Math.min(Math.min(val2,val3),val5);ugly[p++]=minVal;//更新三个链表的当前节点if(minVal==val2){val2=2*ugly[p2++];}if(minVal==val3){val3=3*ugly[p3++];}if(minVal==val5){val5=5*ugly[p5++];}}return ugly[n];}
}

有序矩阵中第k小的元素

链接在这里插入图片描述

class Solution {//用优先级队列辅助//思路:合并多条链表public int kthSmallest(int[][] matrix, int k) {//队列里存{matrix[i][j],i,j} 以便找到后面的元素PriorityQueue<int[]> pq=new PriorityQueue<int[]>(new Comparator<int[]>() {@Overridepublic int compare(int[] o1, int[] o2) {return o1[0]-o2[0];}});//maxtrix每一行相当于一条链表//先把各链表的头结点入队列for(int i=0;i<matrix.length;i++){pq.add(new int[]{matrix[i][0],i,0});}int res=0;while(!pq.isEmpty()&&k>0){int[] pollEle=pq.poll();res=pollEle[0];int i=pollEle[1],j=pollEle[2];//把(i,j+1)的元素入队列if(j+1<matrix[i].length){pq.add(new int[]{matrix[i][j+1],i,j+1});}k--;}return res;}
}

查找和最小的k对数字

链接在这里插入图片描述

//优先级队列+合并链表
class Solution {public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {//队列里存{sum,i,j},sum是nums[i]+nums[j]PriorityQueue<int[]> pq=new PriorityQueue<int[]>(new Comparator<int[]>() {@Overridepublic int compare(int[] o1, int[] o2) {return o1[0]-o2[0];}});int sz1=nums1.length;int sz2=nums2.length;//有sz1条链表,先把各链表的头结点入队列for(int i=0;i<sz1;i++){pq.add(new int[]{nums1[i]+nums2[0],i,0});}List<List<Integer>> res=new LinkedList<>();while(!pq.isEmpty()&&k>0){int[]pollEle=pq.poll();int i=pollEle[1];int j=pollEle[2];LinkedList<Integer> ele=new LinkedList();ele.add(nums1[i]);ele.add(nums2[j]);res.add(ele);//把[i,j+1]入队列if(j+1<nums2.length){pq.add(new int[]{nums1[i]+nums2[j+1],i,j+1});}k--;}return res;}
}

两数相加

链接
在这里插入图片描述

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {ListNode p1=l1;ListNode p2=l2;ListNode dummy=new ListNode(-1);ListNode p=dummy;int carry=0,add=0;while(p1!=null&&p2!=null){add=p1.val+p2.val+carry;carry=add/10;//进位的add%=10;ListNode newNode=new ListNode(add);p.next=newNode;p=p.next;p1=p1.next;p2=p2.next;}while(p1!=null){add=p1.val+carry;carry=add/10;add%=10;ListNode newNode=new ListNode(add);p.next=newNode;p=p.next;p1=p1.next;}while(p2!=null){add=p2.val+carry;carry=add/10;add%=10;ListNode newNode=new ListNode(add);p.next=newNode;p=p.next;p2=p2.next;}if(carry!=0){//还有进位ListNode newNode=new ListNode(carry);p.next=newNode;p=p.next;}p.next=null;return dummy.next;}
}

两数相加2

链接在这里插入图片描述


class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {Stack<Integer> stack=new Stack();//翻转l1链表while(l1!=null){stack.add(l1.val);l1=l1.next;}ListNode head1= new ListNode(stack.pop());ListNode p1=head1;while(!stack.isEmpty()){int cur=stack.pop();ListNode newNode=new ListNode(cur);p1.next=newNode;p1=p1.next;}p1.next=null;//翻转l2链表while(l2!=null){stack.add(l2.val);l2=l2.next;}ListNode head2= new ListNode(stack.pop());ListNode p2=head2;while(!stack.isEmpty()){int cur=stack.pop();ListNode newNode=new ListNode(cur);p2.next=newNode;p2=p2.next;}p2.next=null;//开始计算 跟两数相加1一样的p1=head1;p2=head2;int add=0,carry=0;while(p1!=null && p2!=null){add=p1.val+p2.val+carry;carry=add/10;add%=10;stack.add(add);p1=p1.next;p2=p2.next;}while(p1!=null){add=p1.val+carry;carry=add/10;add%=10;stack.add(add);p1=p1.next;}while(p2!=null){add=p2.val+carry;carry=add/10;add%=10;stack.add(add);p2=p2.next;}if(carry!=0){stack.add(carry);}ListNode dummy=new ListNode(-1);ListNode p=dummy;while(!stack.isEmpty()){int cur=stack.pop();ListNode newNode=new ListNode(cur);p.next=newNode;p=p.next;}p.next=null;return dummy.next;}
}

回文单链表

回文链表

链接
在这里插入图片描述
方法一:用栈来辅助

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public boolean isPalindrome(ListNode head) {Stack<Integer> stack=new Stack();ListNode cur=head;while(cur!=null){stack.add(cur.val);cur=cur.next;}cur=head;while(cur!=null){int val=cur.val;int stackVal=stack.pop();if(val!=stackVal){return false;}cur=cur.next;}return true;}
}

方法二:快慢指针

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {//用快慢指针public boolean isPalindrome(ListNode head) {ListNode fast=head,slow=head;while(fast!=null && fast.next!=null){fast=fast.next.next;slow=slow.next;}if(fast!=null){//奇数个 slow需要+1slow=slow.next;}//从①head->slow-1 ②fast->slowListNode head2= reverse(slow); while(head2!=null){if(head.val!=head2.val){return false;}head=head.next;head2=head2.next;}return true;}//返回翻转后的链表ListNode reverse(ListNode head){if(head==null){return null;}if(head.next==null){//一个节点return head;}ListNode pre=head;ListNode cur=head.next;pre.next=null;while(cur!=null){ListNode next=cur.next;cur.next=pre;pre=cur;cur=next;}return pre;}
}

迭代和递归翻转单链表

反转链表

在这里插入图片描述

方一:迭代

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {//迭代public ListNode reverseList(ListNode head) {if(head==null){return null;}ListNode pre=head,cur=head.next;pre.next=null;while(cur!=null){ListNode next=cur.next;cur.next=pre;pre=cur;cur=next;}return pre;}
}

方二: 递归

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {//递归翻转//定义:翻转以head为头结点的链表后并返回头结点public ListNode reverseList(ListNode head) {//只有一个节点或者是没有节点 不用翻转直接返回if(head==null||head.next==null){return head;}//翻转head.next链表 然后head接在他的后面ListNode realHead=reverseList(head.next);ListNode tail=head.next;tail.next=head;head.next=null;return realHead;}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年主流原型工具测评:墨刀、Axure、Figma、Sketch

2025年主流原型工具测评&#xff1a;墨刀、Axure、Figma、Sketch 要说2025年国内产品经理使用的主流原型设计工具&#xff0c;当然是墨刀、Axure、Figma和Sketch了&#xff0c;但是很多刚入行的产品经理不了解自己适合哪些工具&#xff0c;本文将从核心优势、局限短板、协作能…

RISC-V双核锁步高性能抗辐照MCU芯片技术解析与应用

1. 概念名词解析 安全冗余设计 AS32X601系列通过硬件ECC&#xff08;Error Correction Code&#xff09;保护存储系统&#xff08;内置SRAM、Flash等&#xff09;&#xff0c;并在DMA模块中提供“可选的双核锁步安全备份”机制&#xff0c;支持高可靠性场景下的数据传输容错。…

2024爱分析·央国企数字化应用实践报告

报告综述“央国企KPI”驱动央国企数字化投入稳中有进 在民营企业推进数字化转型的过程中&#xff0c;其核心驱动力往往聚焦于降本增效与开源节流。然而&#xff0c;对于央国企而言&#xff0c;尽管降本增效等因素亦在其考量范围之内&#xff0c;但其推进数字化转型的根本动因则…

Kubernetes 的正式安装

1.基础的网络结构说明 软件路由器 ikuai 当然同一个仅主机模式 相当于在 同一个我们所谓的广播域内 所以相当于它们的几张网卡 是被连接起来的 为了防止出现问题 我们可以把第二块网卡临时关闭一下 2.准备路由器 ikuai 爱快 iKuai-商业场景网络解决方案提供商 (ikuai8.com)…

OpenCV计算摄影学(18)平滑图像中的纹理区域同时保留边缘信息函数textureFlattening()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::textureFlattening 是 OpenCV 中用于图像处理的一个函数&#xff0c;旨在平滑图像中的纹理区域&#xff0c;同时保留边缘信息。该技术特别适…

关于eMMC存储器在各种情况下的分区编号和名字的问题

前言 关于eMMC的分区编号和名字问题&#xff0c;表面上看是个小问题&#xff0c;事实上在程序开发中&#xff0c;没有小问题&#xff0c;一个变量值设置不对&#xff0c;可能整个程序或系统就跑不起来。eMMC的分区编号和名字问题就是一个事关嵌入式系统烧写和正常启动的关键问…

nuxt2-vue2:通过编程方式调用对话框 el-dialog

一、背景 1.1、需求 项目&#xff1a;nuxt2 vue2 希望通过编程方式的调用打开对话框&#xff0c;展现我们想要的内容。 1.2、效果 二、代码 2.1、插件 plugins/dialog.js import Vue from vue; import { Dialog } from element-ui; // 本文使用了Dialog组件&#xff0c;…

记录一些面试遇到的问题

重载和重写的区别 重载是overload&#xff0c;覆盖是override 重载属于编译时多态&#xff0c;覆盖属于运行时多态 运行时多态和编译时多态 运行时多态指的是在运行的时候才知道要调用哪一个函数&#xff0c;编译时多态是指在编译的时候就知道调用哪一个函数。 运行时多态…

【为什么会有 map、weakmap 类型?】

为什么会有 map、weakmap 类型? 传统对象的局限性催生 Map‌1. 键类型单一性‌2. 有序性与迭代支持‌3. 性能优化场景‌ 内存管理需求催生 WeakMap‌1.弱引用机制‌2. 私有数据存储‌3. 规避循环引用问题‌ 总结 传统对象的局限性催生 Map‌ 1. 键类型单一性‌ 传统对象&…

Django下防御Race Condition

目录 漏洞原因 环境搭建 复现 A.无锁无事务时的竞争攻击 B.无锁有事务时的竞争攻击 防御 A.悲观锁加事务防御 B.乐观锁加事务防御 总结 漏洞原因 Race Condition 发生在多个执行实体&#xff08;如线程、进程&#xff09;同时访问共享资源时&#xff0c;由于执行顺序…

课题推荐——无人机在UWB环境下基于TOA/TDOA/AOA的室内定位与精度对比

随着无人机在工业检测、仓储物流、应急救援等室内场景的广泛应用&#xff0c;高精度室内定位技术成为关键支撑。超宽带&#xff08;UWB&#xff09;技术凭借其高时间分辨率、强抗多径能力等优势&#xff0c;成为室内定位的主流方案。然而&#xff0c;不同的定位方法&#xff08…

c语言笔记 fgets

fgets 是 C语言中的一个标准输入输出函数&#xff0c;用于从输入流&#xff08;如文件、键盘等&#xff09;读取一行字符串。它的名字来源于 "File GeT Sring"&#xff0c;表示从文件中读取字符串。 fgets 的函数原型如下&#xff1a; char *fgets(char *str, int n,…

【含文档+PPT+源码】基于微信小程序的农产品自主供销商城系统

项目介绍 本课程演示的是一款基于微信小程序的农产品自主供销商城系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3…

ReAct论文阅读笔记总结

ReAct&#xff1a;Synergizing Reasoning and Acting in Language Models 背景 最近的研究结果暗示了在自主系统中结合语言推理与交互决策的可能性。 一方面&#xff0c;经过适当Prompt的大型语言模型&#xff08;LLMs&#xff09;已经展示了在算术、常识和符号推理任务中通…

20250306-笔记-精读class CVRPEnv:step(self, selected)

文章目录 前言一、if self.time_step<4:控制时间步的递增判断是否在配送中心特定时间步的操作更新更新当前节点和已选择节点列表更新需求和负载更新访问标记更新负无穷掩码更新步骤状态&#xff0c;将更新后的状态同步到 self.step_state 二、使用步骤总结 前言 class CVRP…

nginx服务器实现上传文件功能_使用nginx-upload-module模块

目录 conf文件内容如下html文件内容如下上传文件功能展示 conf文件内容如下 #user nobody; worker_processes 1;error_log /usr/logs/error.log; #error_log /usr/logs/error.log notice; #error_log /usr/logs/error.log info;#pid /usr/logs/nginx.pid;even…

mapbox进阶,模仿百度,简单实现室内楼层切换

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️fill-extrusion三维填充图层样式1.4 ☘…

String / StringBuffer / StringBuilder 的区别是什么?

String、StringBuffer 和 StringBuilder 都是 Java 中用于处理字符串的类&#xff0c;但它们在多个方面存在区别&#xff0c;以下是详细介绍&#xff1a; 1. 可变性 4. 使用场景 String&#xff1a;String 类是不可变的&#xff0c;一旦创建了一个 String 对象&#xff0c;它的…

为何吹订单?因为特斯拉的销量已遥遥领先,掩耳盗铃之举!

从去年以来&#xff0c;多家新造车企业都经常拿大定、小定的数据来说事&#xff0c;而不是如之前说销量领先&#xff0c;原因就在于他们曾对标的特斯拉在销量方面已远远超越&#xff0c;在销量方面无法与特斯拉比拼&#xff0c;就只好用订单 国内媒体一片宣传特斯拉在中国的销量…

深入掌握Redis:从原理到实践的全方位指南

文章为原创&#xff0c;转载请注明出处——Gavana - 半分之月&#x1f319;。 文章在我的博客中同步更新&#xff0c;也可访问本文链接——深入掌握Redis&#xff1a;从原理到实践的全方位指南 | Gavana 关注AI开发工程师Gavana&#xff0c;带你了解更多实用有趣的AI宝藏✨ 个人…