数据结构——链表题目

文章目录

  • JZ25 合并两个排序的链表(简单)
  • NC22 合并两个有序的数组(简单)
  • NC3 链表中环的入口节点(中等)
  • NC50 链表中的节点每k个一组翻转(中等)
  • NC53 删除链表的倒数第n个节点(中等)


JZ25 合并两个排序的链表(简单)

链接 简单题
题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

输入:
{1,3,5},{2,4,6}
返回值:
{1,2,3,4,5,6}

解题思路
有递归和非递归两种思路
思路一:递归
在这里插入图片描述

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
//递归的解法
class Solution {
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
        ListNode* tmp = nullptr;
        if(pHead1 == nullptr) return pHead2;
        if(pHead2 == nullptr) return pHead1;
        
        if(pHead1->val <= pHead2->val)
        {
            tmp = pHead1;
            tmp->next = Merge(pHead1->next,pHead2);
        }
        else{
            tmp = pHead2;
            tmp->next = Merge(pHead1,pHead2->next);
        }
        return tmp;
    }
};

解法二:非递归解法
在这里插入图片描述
在这里插入图片描述

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
        ListNode* i = pHead1, * j = pHead2;
        if(i == nullptr) return pHead2;
        if(j == nullptr) return pHead1;
        ListNode node(-1);
        ListNode* tmp = &node;
        while(i != nullptr && j != nullptr)
        {
            if(i != nullptr && i->val <= j->val) 
            {
                tmp->next = i;
                i = i->next;
                tmp = tmp->next;
            }
            if(i == nullptr)
            {
                tmp->next = j;
                break;
            }
                
            if(j != nullptr && i->val > j->val)
            {
                tmp->next = j;
                j = j->next;
                tmp = tmp->next;
            }
            if(j == nullptr)
            {
                tmp->next = i;
                break;
            } 
        }
        return node.next;
    }
};

NC22 合并两个有序的数组(简单)

链接 简单题
题目描述
在这里插入图片描述
在这里插入图片描述
解题思路
在这里插入图片描述

class Solution {
public:
    void merge(int A[], int m, int B[], int n) {
        int pos = m + n - 1;
        int i = m-1,j = n-1;
        while(pos > 0 && i >= 0 && j >= 0)
        {
//             if(A[i] >= B[j])
//             {
//                 A[pos] = A[i];
//                 pos--;
//                 i--;
//             }
                
//             else{
//                 A[pos] = B[j];
//                 pos--;
//                 j--;
//             }
                
            
            A[pos--] = (A[i] >= B[j] ? A[i--] : B[j--] );
        }
        while(i >= 0)
            A[pos--] = A[i--];
        while(j >= 0)
            A[pos--] = B[j--];
    }
};

NC3 链表中环的入口节点(中等)

链接 难度:中等
描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,返回null。
在这里插入图片描述
解析
双指针法:
假设一圈相遇a+b+c+b=2(a+b) 所以a = c

在这里插入图片描述


class Solution {
public:
    ListNode* EntryNodeOfLoop(ListNode* pHead) {
        if(pHead == nullptr || pHead->next == nullptr)
            return nullptr;
        ListNode* fast = pHead;
        ListNode* slow = pHead;
        //找到相遇的点
        while(fast != nullptr && fast->next != nullptr)
        {
            fast = fast->next->next;
            slow = slow->next;
            if(fast == slow)
                break;
        }
        //将fast指针指向头结点
        if(fast != nullptr && fast->next != nullptr)
            fast = pHead;
        else
            return nullptr;
        while(fast != slow)
        {
            fast = fast->next;
            slow = slow->next;
        }
        return fast;  //再次找到相遇点就是环的入口点
    }
};

哈希法:
遍历单链表的每个结点
如果当前结点地址没有出现在set中,则存入set中
否则,出现在set中,则当前结点就是环的入口结点
整个单链表遍历完,若没出现在set中,则不存在环


class Solution {
public:
    ListNode* EntryNodeOfLoop(ListNode* pHead) {
        if(pHead == nullptr) return nullptr;
        ListNode* cur = pHead;
        
        set<ListNode*> myset;
        while(cur != nullptr)
        {
            if(myset.count(cur) != 0)
                return cur;
            myset.insert(cur);
            cur = cur->next;
        }
        return nullptr;
        
    }
};

NC50 链表中的节点每k个一组翻转(中等)

链接 难度:中等
题目描述
在这里插入图片描述

解析

把 k 个数压入栈中,然后弹出来的顺序就是翻转的! 这里要注意几个问题:
第一,剩下的链表个数够不够 k 个(因为不够 k 个不用翻转);
第二,已经翻转的部分要与剩下链表连接起来。


/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param head ListNode类 
     * @param k int整型 
     * @return ListNode类
     */
    ListNode* reverseKGroup(ListNode* head, int k) {
        // write code here
        if (head == nullptr || k <= 1) return head;
        ListNode* cur = head;   //cur用来标志当前的位置
        ListNode node(-1);
        ListNode* tmp = &node;  //tmp指向的是新链表
        
        stack<ListNode*> st;
        //循环原有链表
        while(cur != nullptr)
        {
            int count = 0; //计数
            //入栈操作
            while(count < k && cur)
            {
                st.push(cur);
                cur = cur->next;
                count++;
            }
            //正常的出栈操作
            while(k == count && !st.empty())
            {
                tmp->next = st.top();
                st.pop();
                tmp = tmp->next;
            }
            //最后一段的操作
            if(count != k)
            {
                tmp->next = head;  
                break;
            }
            //重置下一次操作的初始结点 
            //这个非常重要,如果没有这个,测试用例[1,2],2就通过不了,因为二者成为了闭环
            //tmp指向的一直都不是空,这时候cur为空了,所以这次结束就把tmp->next置为空
            tmp->next = cur;   
            head = cur;
        }
        return node.next;        
    }
};

NC53 删除链表的倒数第n个节点(中等)

题目描述
给定一个链表,删除链表的倒数第 nn 个节点并返回链表的头指针
例如,
给出的链表为: 1\to 2\to 3\to 4\to 51→2→3→4→5, n= 2n=2.
删除了链表的倒数第 nn 个节点之后,链表变为1\to 2\to 3\to 51→2→3→5.

备注:
题目保证 nn 一定是有效的
请给出时间复杂度为\ O(n) O(n) 的算法
解题思路
利用快慢指针


class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        // write code here
        if(head == nullptr && n <= 0) return head;
        ListNode* fast = head;
        ListNode* slow = head;
        //先让快慢指针保持n距离
        while(n && fast)
        {
            fast = fast->next;
            n--;
        }
        //n > 0说明链表的长度没有n大
        if(n > 0)
            return head;
        if(fast == nullptr)    //fast == nullptr倒数第n个节点刚好是第一个结点
            return head->next;
        while(fast->next != nullptr) //大部分的情况
        {
            slow = slow->next;
            fast = fast->next;
        }
        slow->next = slow->next->next;;
        return head;
    }
};

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

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

相关文章

软件崩溃时VS中看不到有效的调用堆栈,使用Windbg动态调试去分析定位

目录 1、问题说明 2、使用Windbg查看崩溃时详细的函数调用堆栈 3、将Windbg中显示的函数调用堆栈对照着C源码进一步分析 4、最后 VC常用功能开发汇总&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&#xff09;https://blog.csdn.net/chenlycly/art…

[Java学习日记]多线程练习、线程池

目录 一.案例&#xff1a;五个人抢红包 二.案例&#xff1a;两个抽奖池抽奖 三.案例&#xff1a;两个抽奖池抽奖&#xff1a;获取线程运行的结果 四.线程池&#xff1a;用来存放线程&#xff0c;避免多次重复创建线程 五.自定义线程池 六.最大并行数与线程池大小 一.案例&…

【Android】Glide的简单使用(上)

文章目录 引入Glide的优点:缺点: 使用常用方法:从网络加载图片从文件加载图片加载resource资源加载URI地址设置占位图出错时的图片占位图图片过渡的Transitions自定义过渡动画图片大小调整缩放图片播放gifasGif()把Gif当作Bitmap播放显示本地视频缩略图 引入 Glide是Google员工…

IntelliJ IDEA 2023.2新特性详解第三弹!Docker、Kubernetes等支持!

9 Docker 在 Docker 镜像层内预览文件 现在可以在 Services&#xff08;服务&#xff09;工具窗口中轻松访问和预览 Docker 镜像层的内容。 从列表选择镜像&#xff0c;选择 Show layers&#xff08;显示层&#xff09;&#xff0c;然后点击 Analyze image for more informati…

平价开放式耳机怎么选?盘点几款好用的平价开放式耳机!

在这个充满音频奇迹的年代&#xff0c;选一副好耳机就像是挑选人生伴侣一样重要&#xff0c;而开放式耳机&#xff0c;由于佩戴无需入耳带来了不错的舒适度&#xff0c;就此受到了许多人的喜爱。 可问题是&#xff0c;市面上平价开放式耳机太多&#xff0c;让人眼花缭乱&#…

医院运维 告警闪现后的故障排查

长期以来&#xff0c;医院信息化运维中存在着科室复杂、应用场景多、终端运维工作量大、软件系统兼容需求强等诸多痛点&#xff0c;且对技术设备的稳定性、连续性要求极高&#xff0c;在日常运维中&#xff0c;需要应对和解决这些问题来保障业务稳定、健康运行。 1、数据孤岛 …

【离散数学】——期末刷题题库(二元关系作业一(运算性质闭包))

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

揭秘MQTT:为何它是物联网的首选协议?

文章目录 MQTT 协议简介概览MQTT 与其他协议对比MQTT vs HTTPMQTT vs XMPP 为什么 MQTT 是适用于物联网的最佳协议&#xff1f;轻量高效&#xff0c;节省带宽可靠的消息传递海量连接支持安全的双向通信在线状态感知 MQTT 5.0 与 3.1.1MQTT 服务器MQTT 客户端 MQTT 协议简介 概…

acwing1209.带分数暴力与优化(java版)

//n a b / c n是确定的,只需找到其中两个。判断剩下一个数是否满足条件即可 //由题目条件可知,每个数不能重复使用,需要一个st全局数组判断每个数是否使用过 //递归实现排列型枚举,cn ac b //对于枚举出来的每一个a,再去枚举每一个c,再在c的枚举里判断b是否满足条件 //…

第四期丨酷雷曼无人机技能培训

第4期无人机技能培训 2023年10月25日&#xff0c;酷雷曼无人机技能培训及执照考试第四期成功举办&#xff0c;自7月份首期开办以来&#xff0c;已按照每月一期的惯例连续举办四期&#xff0c;取得了极为热烈的反响。 随着无人机培训的重要性及影响力逐渐扩大&#xff0c;参加培…

算法-贪心思想

贪心的思想非常不好解释&#xff0c;而且越使用权威的语言解释越难懂。而且做题的时候根据自己的理解可能直接做出来&#xff0c;但是非要解释一下怎么使用的贪心的话&#xff0c;就懵圈了。一般来说&#xff0c;贪心的题目没有固定的套路&#xff0c;一题一样&#xff0c;不过…

分享67个节日PPT,总有一款适合您

分享67个节日PPT&#xff0c;总有一款适合您 67个节日PPT下载链接&#xff1a;https://pan.baidu.com/s/1oU-UUCV_69e8Gp5Y6zrzVA?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易…

Spark---Spark on Hive

1、Spark On Hive的配置 1&#xff09;、在Spark客户端配置Hive On Spark 在Spark客户端安装包下spark-2.3.1/conf中创建文件hive-site.xml&#xff1a; 配置hive的metastore路径 <configuration><property><name>hive.metastore.uris</name><v…

关于对ArrayBlockingQueue 的AQS探究

1、介绍 条件队列是 AQS 中最容易被忽视的一个细节。大部分时候&#xff0c;我们都用不上条件队列&#xff0c;但是这并不说明条件队列就没有用处了&#xff0c;它反而是我们学习生产者-消费者模式的最佳教材。条件队列是指一个阻塞队列&#xff0c;其中的元素是等待某个条件成…

每日一题:LeetCode-75. 颜色分类

每日一题系列&#xff08;day 12&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…

ROS 元功能包

ROS元功能包&#xff08;Metapackage&#xff09;是一种特殊的软件包&#xff0c;它本身并不包含任何可执行代码或数据文件。在ROS 1中&#xff0c;可以通过catkin_create_pkg命令创建元功能包。 相反&#xff0c;它的主要目的是作为一组相关功能包的集合或者依赖关系列表。使…

蓝桥杯每日一题2023.12.5

题目描述 1.一步之遥 - 蓝桥云课 (lanqiao.cn) 题目分析 对于本题遵循多了就减少了就加的原则&#xff0c;用while进行计算即可 #include<bits/stdc.h> using namespace std; int x, ans; int main() {while(x ! 1){if(x < 1)x 97;else x - 127;ans ;}cout <&…

vue-cli创建项目运行报错this[kHandle] = new _Hash(algorithm, xofLen);(完美解决)

1&#xff1a;问题出现的原因 出现这个问题是node.js 的版本问题&#xff0c;因为 node.js V17开始版本中发布的是OpenSSL3.0, 而OpenSSL3.0对允许算法和密钥大小增加了严格的限制&#xff0c;可能会对生态系统造成一些影响。故此以前的项目在使用 nodejs V17以上版本后会报错。…

使用VBA快速统计词组(单词组合)词频

实例需求&#xff1a;产品清单如A列所示&#xff0c;现在如下统计词组词频。想必各位小伙伴都指定如何使用字典对象实现去重&#xff0c;进而实现单个单词的词频统计。 但是统计词组词频就没有那么简单了&#xff0c;为了便于演示&#xff0c;此处的词组只限于两个单词的组合。…

阿里云Arthas使用——在日志没有输出异常情况下,如何进行线上bug定位 stack命令 和 trace命令

前言 Arthas 是一款线上监控诊断产品&#xff0c;通过全局视角实时查看应用 load、内存、gc、线程的状态信息&#xff0c;并能在不修改应用代码的情况下&#xff0c;对业务问题进行诊断&#xff0c;包括查看方法调用的出入参、异常&#xff0c;监测方法执行耗时&#xff0c;类…