双指针技巧,链表

双指针链表

虚拟头节点+双指针,都要用虚拟1头节点

合并两个有序链表

设置双指针,都指向虚拟头节点

ListNode list1 代表的是头节点

class Solution {
    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        ListNode dummy=new ListNode(-1);
        ListNode p=dummy;
        ListNode p1=list1;
        ListNode p2=list2;
        while(p1!=null&&p2!=null){
            if(p1.val<p2.val){
                p.next=p1;
                p1=p1.next;
            }else{
                p.next=p2;
                p2=p2.next;
            }
            p=p.next;
        }
        if(p1!=null){
            p.next=p1;
        }
        if(p2!=null){
            p.next=p2;
        }
        return dummy.next;
    }
}

单链表的分解(两个小链表可能会成环,要处理

具体来说,我们可以把原链表分成两个小链表,一个链表中的元素大小都小于 x,另一个链表中的元素都大于等于 x,最后再把这两条链表接到一起,就得到了题目想要的结果。

/**
 * 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 partition(ListNode head, int x) {
        ListNode dummy1=new ListNode(-1);//记录小于x
        ListNode dummy2=new ListNode(-1);
        ListNode p=head,p1=dummy1,p2=dummy2;
        while(p!=null){
            if(p.val<x){
                p1.next=p;
                p1=p1.next;
            }else{
                p2.next=p;
                p2=p2.next;
            }
            ListNode temp=p.next;//断开p的next,否则会成环
            p.next=null;
            p=temp;
            
        }
        p1.next=dummy2.next;
        return dummy1.next;
    }
}

合并k个升序链表(用优先队列实现最小堆

每次弹出最小的结点值,给新链表。

弹出一个,要再存入一个

class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        ListNode dummy=new ListNode(-1);
        ListNode p=dummy;
        PriorityQueue<ListNode> pq=new PriorityQueue<>((a,b)->(a.val-b.val));//创建最小堆
        for(ListNode head:lists){
            if(head!=null) pq.add(head);
        }
        while(!pq.isEmpty()){
            ListNode node=pq.poll();//弹出一个最小的
            if(node.next!=null){
                pq.add(node.next);//存入下一个结点
            }
            p.next=node;
            p=p.next;
        }
        return dummy.next;
    }
}

删除链表倒数第n个结点

定义两个指针,一个在左一个在右边,距离为n,右指针走n次即可。走到最后一个结点则停止,因为删除结点要知道要删除结点的前一个结点。

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dummy=new ListNode(-1,head);
        ListNode left=dummy;
        ListNode right=dummy;
        while(n-->0){
            right=right.next;
        }
        while(right.next!=null){
            left=left.next;
            right=right.next;
        }
        left.next=left.next.next;
        return dummy.next;
    }
}

链表的中间结点

定义快慢指针,走两步和走一步。返回slow.next

class Solution {
    public ListNode middleNode(ListNode head) {
        ListNode dummy=new ListNode(-1,head);
        ListNode slow=dummy,fast=dummy;
        while(fast.next!=null&&fast.next.next!=null){
            slow=slow.next;
            fast=fast.next.next;
        }
        return slow.next;
    }
}

环形链表

快慢指针判断链表是否为环形,在相遇点时,slow重置到head。快慢指针同时开始走1步直到相遇则是环。

public class Solution {
    public ListNode detectCycle(ListNode head) {
        if(head==null||head.next==null) return null;//这里条件是或
        ListNode slow=head;
        ListNode fast=head;
        ListNode p=head;
        while(fast!=null&&fast.next!=null){
            slow=slow.next;
            fast=fast.next.next;
            if(slow==fast) break;
        }
        if(slow!=fast){
            return null;
        }
        slow=head;
        while(slow!=fast){
            slow=slow.next;
            fast=fast.next;
        }
        return slow;
    }
}

相交链表

遍历完A遍历B,遍历完B遍历A,之后会相交

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode p1=headA;
        ListNode p2=headB;
        while(p1!=p2){
            p1=p1.next;
            p2=p2.next;
            if(p1==null&&p2==null) return null;
            if(p1==null) p1=headB;
            if(p2==null) p2=headA;
        }
        return p1;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

怎么压缩pdf pdf在线压缩 pdf文件压缩大小

pdf文件无论在何种设备上打开&#xff0c;PDF文件都能保持其原始的布局和格式&#xff0c;这对于文档共享和打印非常重要。PDF不仅支持文本&#xff0c;还能嵌入图像、视频、音频以及动态链接等元素。PDF文件支持加密和密码保护&#xff0c;可以限制访问、编辑、复制或打印文档…

5.命令行提示符

一、打开终端&#xff08;有以下几种方式&#xff09; 1.在搜索框输入 terminal 2.命令 &#xff08;1&#xff09;ctrlaltt打开新的终端 &#xff08;2&#xff09;ctrlshiftt&#xff1a;在已经打开终端的基础内&#xff0c;新打开一个同路径的终端。 &#xff08;3&#xf…

鸿蒙开发接口图形图像:【@ohos.screen (屏幕)】

屏幕 本模块提供管理屏幕的一些基础能力&#xff0c;包括获取屏幕对象&#xff0c;监听屏幕变化&#xff0c;创建和销毁虚拟屏幕等。 说明&#xff1a;开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。…

ES学习圣经:从0到1, 精通 ElasticSearch 工业级使用

尼恩&#xff1a;百亿级数据存储架构起源 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;经常性的指导小伙伴们改造简历。 经过尼恩的改造之后&#xff0c;很多小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试机会&#xff0c…

手绘任意波

上位机发送手绘波形数据&#xff0c;下位机接收并输出。 支持 STM32 STC arduino Pico 等多种单片机&#xff0c;内置或外置 DAC 实现。 ​​​​​​​ 篇幅所限&#xff0c;更多内容请访问我的网站&#xff1a; jiangge12.github.io 十二江哥的网站 (jiangge12.github.io)…

Django 入门教程

1. Django简介 基本介绍 Django 是一个由 Python 编写的一个开放源代码的 Web 应用框架。 MVC 与 MVT 模型 MVC 模型 MVC 模式&#xff08;Model–view–controller&#xff09;是软件工程中的一种软件架构模式&#xff0c;把软件系统分为三个基本部分&#xff1a;模型&am…

python数据可视化:自定义闭合区域填充颜色matplotlib.pyplot.fill()

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 python数据可视化&#xff1a; 自定义闭合区域填充颜色 matplotlib.pyplot.fill() [太阳]选择题 以下关于matplotlib.pyplot.fill()函数说法正确的是&#xff1f; import matplotlib.pyplo…

vue 微信公众号定时发送模版消息

目录 第一步&#xff1a;公众号设置 网页授权第二步&#xff1a;引导用户去授权页面并获取code第三步&#xff1a;通过code换取网页授权access_token&openid第四步&#xff1a;后端处理绑定用户和发送消息 相关文档链接&#xff1a; 1、微信开发文档 2、订阅号/服务号/企业…

Hadoop伪分布式搭建

1 配置SSH免密登录 1.生成密钥 # ssh-keygen -t rsa 注意&#xff1a;需要经过4次回车 查看密钥及公钥 # cd /root/.ssh 拷贝公钥 # cp id_rsa.pub authorized_keys 2 测试本地免密登录 2 下载Hadoop安装包 使用wget命令从华为云上下载Hadoop安装文件 # wget -P /opt https://m…

Py列表(list)

目录 正向索引&#xff1a; 反向索引&#xff1a; 嵌套列表&#xff1a; 修改列表中的值 列表常用的方法 实例 练习&#xff1a; 正向索引&#xff1a; 从0开始&#xff0c;依次递增。第一个元素的索引为0&#xff0c;第二个元素的索引为1&#xff0c;依此类推。 列表的下标…

Kubernetes集群调度

一.List-Watch 1.调度约束 Kubernetes 是通过 List-Watch **** 的机制进行每个组件的协作&#xff0c;保持数据同步的&#xff0c;每个组件之间的设计实现了解耦。 用户是通过 kubectl 根据配置文件&#xff0c;向 APIServer 发送命令&#xff0c;在 Node 节点上面建立 P…

Let‘s Encrypt 免费证书申请

填写邮箱&#xff0c;申请的域名 单域名&#xff1a;www.example.com 泛域名&#xff1a; *.example.com yum -y install certbot sudo certbot certonly --server https://acme-v02.api.letsencrypt.org/directory --manual --preferred-challenges dns --email xxexample…

Golang | Leetcode Golang题解之第102题二叉树的层序遍历

题目&#xff1a; 题解&#xff1a; func levelOrder(root *TreeNode) [][]int {ret : [][]int{}if root nil {return ret}q : []*TreeNode{root}for i : 0; len(q) > 0; i {ret append(ret, []int{})p : []*TreeNode{}for j : 0; j < len(q); j {node : q[j]ret[i] …

如何选择序列化协议:关键因素与场景分析

如何选择序列化协议&#xff1a;关键因素与场景分析 序列化协议的选择直接影响着系统的性能、可维护性及跨平台兼容性。以下是针对不同场景下&#xff0c;几种常见序列化协议的选择建议&#xff1a; 1. 公司间系统调用&#xff08;性能要求宽松&#xff09; SOAP (基于XML)&a…

vue深度选择器(:deep​)

处于 scoped 样式中的选择器如果想要做更“深度”的选择&#xff0c;也即&#xff1a;影响到子组件&#xff0c;可以使用 :deep() 这个伪类&#xff1a; <style lang"scss" scoped> .evaluation-situation-details :deep .cl-icon-arrow-right {display: none…

C语言学习笔记--C语言的实型数据

实型常量的表示方法&#xff08;掌握&#xff09; 实型也称为浮点型。实型常量也称为实数或者浮点数。在C语言中&#xff0c;实数只采用十进制。它有两种形式&#xff1a;十进制小数形式&#xff0c;指数形式。 1十进制数形式&#xff1a;由数码0~9和小数点组成。 例如&…

VSCODE中F12无法跳转,快捷键设置F12和insert混淆了

异常现象 最近用新电脑&#xff08;华为&#xff09;的时候&#xff0c;发现VSCODE经常按F12无法跳转&#xff0c;在快捷键设置当中&#xff0c;也是设置成功的&#xff1b; 此时重新去快捷键设置&#xff0c;会发现按 F12变为了Insert 解决方法 华为笔记本的Fx按键&#x…

淘宝扭蛋机小程序开发:探索无限惊喜的购物新体验

随着科技的不断进步&#xff0c;人们的生活方式也在发生翻天覆地的变化。在这个数字化、智能化的时代&#xff0c;淘宝扭蛋机小程序应运而生&#xff0c;为消费者带来了一种全新的购物体验。 淘宝扭蛋机小程序是一款集娱乐、互动、购物于一体的创新应用。它巧妙地将扭蛋机的乐…

FL Studio v21.2.3.4004中文破解版百度网盘下载

FL Studio v21.2.3.4004中文破解版是一款完整的软件音乐制作环境或数字音频工作站 (DAW)。代表了超过 18 年的创新发展&#xff0c;它在一个软件包中提供了您创作、编曲、录制、编辑、混音和掌握专业品质音乐所需的一切。FL Studio v21.2.3.4004中文破解版现在是世界上最受欢迎…

微信小程序中使用vantUI步骤

第一步&#xff0c;配置project.config.json 在setting中新增如下&#xff1a; "packNpmManually": true,"packNpmRelationList": [{"packageJsonPath": "./package.json","miniprogramNpmDistDir": "./"}], 第…