首页 > 其他分享 >刷题复习(一)链表

刷题复习(一)链表

时间:2023-11-26 23:13:48浏览次数:40  
标签:head ListNode 复习 val int next 链表 temp 刷题

刷题复习(一)链表

https://labuladong.gitee.io/algo/di-ling-zh-bfe1b/shuang-zhi-0f7cc/

1、合并两个有序链表

思路清晰,双链表有个根节点记录开头


/**
 * 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 mergeTwoLists(ListNode list1, ListNode list2) {
        ListNode root = new ListNode();
        ListNode temp = root;
        while (list1 != null && list2 != null) {
            if (list1.val > list2.val) {
                temp.next = list2;
                list2 = list2.next;
            } else {
                temp.next = list1;
                list1 = list1.next;
            }
            temp = temp.next;
        }
        if (list1 == null) {
            temp.next = list2;
        } else {
            temp.next = list1;
        }
        return root.next;
    }
}

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 {
    //输入:head = [1,4,3,2,5,2], x = 3
    //输出:[1,2,2,4,3,5]
    //示例 2:
    //
    //输入:head = [2,1], x = 2
    //输出:[1,2]

    public ListNode partition(ListNode head, int x) {
        ListNode temp1 = new ListNode();
        ListNode temp2 = new ListNode();
        ListNode root1 = temp1;
        ListNode root2 = temp2;
        while (head != null) {
            if (head.val < x) {
                temp1.next = head;
                temp1 = temp1.next;
            } else {
                temp2.next = head;
                temp2 = temp2.next;
            }
            head = head.next;
        }
        temp1.next = root2.next;
        temp2.next = null;
        return root1.next;
    }

}

3、合并K个升序链表

不难的hard,优先队列 PriorityQueu要学会使用,用优先队列就不难了

image-20231126220339155

        PriorityQueue<ListNode> pq = new PriorityQueue<>(lists.length,(o1,o2)->(o1.val-o2.val));

通过lamda方式构造小顶堆,默认就是小顶堆

image-20231126220643061

/**
 * 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 mergeKLists(ListNode[] lists) {
        if(lists== null ||lists.length== 0){
            return null;
        }
        ListNode root = new ListNode(0);
        ListNode temp = root;
        PriorityQueue<ListNode> pq = new PriorityQueue<>(lists.length,(o1,o2)->(o1.val-o2.val));
        for(ListNode node: lists){
            if(node != null){
                pq.add(node);
            }
        }
        while(!pq.isEmpty()){
            ListNode cur = pq.poll();
            temp.next = cur;
            if(cur.next!=null){
                pq.add(cur.next);
            }
            temp = temp.next;
        }
        return root.next;
    }
}

4、删除链表的倒数第 N 个结点

这道题目有技巧,需要寻找倒数第k个节点

代码应该是如下

// 返回链表的倒数第 k 个节点
ListNode findFromEnd(ListNode head, int k) {
    ListNode p1 = head;
    // p1 先走 k 步
    for (int i = 0; i < k; i++) {
        p1 = p1.next;
    }
    ListNode p2 = head;
    // p1 和 p2 同时走 n - k 步
    while (p1 != null) {
        p2 = p2.next;
        p1 = p1.next;
    }
    // p2 现在指向第 n - k + 1 个节点,即倒数第 k 个节点
    return p2;
}

完整解答,尤其需要注意测试用例会出现k个数删除倒数第k个,由于算法是寻找倒数k+1的所以需要用虚拟节点root节点去防止出现这种情况

/**
 * 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 removeNthFromEnd(ListNode head, int n) {
        ListNode root = new ListNode(0);
        root.next= head;
        ListNode cur=help(root,n+1);
        cur.next = cur.next.next;
        return root.next;
    }

    public ListNode help(ListNode head ,int n){
        ListNode temp1 = head;
        for(int i=0;i<n;i++){
            temp1= temp1.next;
        }
        ListNode temp2 = head;
        while(temp1!=null){
            temp2=temp2.next;
            temp1=temp1.next;
        }
        return temp2;
    }
}

标签:head,ListNode,复习,val,int,next,链表,temp,刷题
From: https://www.cnblogs.com/wusier/p/17858172.html

相关文章

  • 性能测试复习准备——linux环境下安装kafka_2.13-3.2.3.tgz
    参考:https://www.bilibili.com/video/BV1Xy4y1G7zA?p=6&vd_source=79bbd5b76bfd74c2ef1501653cee29d6      解压到目录路径下:  启动kafka之前,首先启动zk:       修改配置文件:        启动kafka和查看:       ......
  • 双链表
    一、算法描述本篇文章讲述的数据结构是双链表,与上一篇文章一样是算法竞赛中常用的用数组模拟的双链表。//用数组模拟的双链表定义如下:inte[N],l[N],r[N],idx;/* e[i]表示节点i的值 l[i]表示节点i的左边一个节点 r[i]表示节点i的右边一个节点 idx表示当前用到了哪个节......
  • web前端基础复习整理
    考试题型:单项选择题:30分(15题)多项选择题:10分(5题)简答题:30分(5题,每题6分)编程题:30分(3题,每题10分)第1章课程简介1.1课程主要内容1.2课程的重要性1.3课程中用到的工具了解第2章Web导论2.1WEB的定义、表现形式和特点网络,互联网等领域超文本,超媒体,超文本传输协议HTTP动态的,图......
  • redis基础命令复习(Sring,Hash,List,Set,SortedSet)
    1,Redis数据结构:  https://redis.io/commands  2,Redis命令---Redis通用命令(常见的有,keys,del,exists,expire,ttl)2.1,keys:查看符合模板的所有key,不建议在生产环境设备上使用 打开redis:win+R,输入cmd,打开命令提示符后,输入redis-server;  再另外打开一个命令提示......
  • 单链表
    一、算法描述本篇文章讲述的数据结构是单链表,当然不是常规的单链表,而是算法竞赛中常用的用数组模拟的单链表。//常规的单链表定义如下:struct{intval;Node*next;}//用数组模拟的单链表定义如下:inthead;inte[N],ne[N],idx;/* head表示头结点的下标 e[......
  • 设计模式相关复习短篇
    1--设计模式基本概念设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码,让代码更容易被他人理解、提高代码的可靠性。2--设计模式基本要素模式名称,问题,解决方案,效果模式别名,模式的分类,模式的适用性,模式角色,模式实例,模......
  • 约瑟夫(环形链表)
    约瑟夫(环形链表)/***@author缪广亮*@version1.0*/classJoseph{publicstaticvoidmain(String[]args){CircleSingleLinkedListcircleSingleLinkedList=newCircleSingleLinkedList();circleSingleLinkedList.addBoy(5);circ......
  • 数据库总结复习(并发控制三)
    目录前言封锁粒度概念多粒度封锁意向锁类型规则小结--引出问题索引锁前言本文为JMU22级数据库原理考前复习而总结归纳,刨除了课本以及课堂上晦涩且长篇大论的文章,以尽量简洁易懂的语句来对知识点进行归纳。继上一篇文章提到的“封锁粒度”接着对并发控制进行归纳总结。封锁......
  • 链表和双线链表
    单链表1.创建一个Node类//head不能动,头节点作用是表示链表的头privateNodehead;//在linkedList类写一个Node的成员内部类privateclassNode{privateintdata;privateNodenext;publicNode(intdata){this.data=data;th......
  • 网络安全与基础总复习
    零——复习资料网络安全基础应用与标准(第六版)Netsec中文译版课件第一章——引言CIA三元组机密性(Confidentiality):数据机密性;隐私性完整性(Integrity):数据完整性;系统完整性可用性(Availability)为了使安全场景更全面又提出新的概念,提及较多的有:真实性,可计量性安全的三个......