
链表、栈、队列
码奴生来就只知道前进
我的GitHub账号:www.github.com/Mrhuangyi
展开
-
203. 移除链表元素
题目描述删除链表中等于给定值 val 的所有节点。示例:输入: 1->2->6->3->4->5->6, val = 6输出: 1->2->3->4->5分析为了方便处理链表的首个节点,我们可以定义一个辅助的头结点dummy,然后让辅助结点指向链表表头,之后遍历链表,当碰到链表某个结点的值等于给定值,只需让当前结点的前一个结点...原创 2019-10-01 00:19:37 · 241 阅读 · 0 评论 -
82. 删除排序链表中的重复元素 II
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。示例 1:输入: 1->2->3->3->4->4->5输出: 1->2->5示例 2:输入: 1->1->1->2->3输出: 2->3遍历的时候需要记录一个prev节点,用来 处理删除节点之后节点重新连接的问题。...原创 2018-09-23 19:29:48 · 202 阅读 · 0 评论 -
109. 有序链表转换二叉搜索树
给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。示例:给定的有序链表: [-10, -3, 0, 5, 9],一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3...原创 2018-09-12 10:49:46 · 284 阅读 · 0 评论 -
1051 Pop Sequence (25)(25 分)
1051 Pop Sequence (25)(25 分) Given a stack which can keep M numbers at most. Push N numbers in the order of 1, 2, 3, …, N and pop randomly. You are supposed to tell if a given sequence of numbers is ...原创 2018-08-10 15:27:39 · 589 阅读 · 0 评论 -
876. 链表的中间结点
给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。示例 1:输入:[1,2,3,4,5]输出:此列表中的结点 3 (序列化形式:[3,4,5])返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。注意,我们返回了一个 ListNode 类型的对象 ans,这样:ans.val = 3, ans.n...原创 2018-08-01 15:07:33 · 628 阅读 · 0 评论 -
L2-022 重排链表(25 分)
给定一个单链表 L~1~→L~2~→…→L~n-1~→L~n~,请编写程序将链表重新排列为 L~n~→L~1~→L~n-1~→L~2~→…。例如:给定L为1→2→3→4→5→6,则输出应该为6→1→5→2→4→3。输入格式:每个输入包含1个测试用例。每个测试用例第1行给出第1个结点的地址和结点总个数,即正整数N (<= 10^5^)。结点的地址是5位非负整数,NULL地址用-1表示。...原创 2018-07-04 17:35:33 · 1825 阅读 · 0 评论 -
23. 合并K个排序链表
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。示例:输入:[ 1->4->5, 1->3->4, 2->6]输出: 1->1->2->3->4->4->5->6分析:先合并两个有序链表,然后再将先前合并的与剩余的链表继续两两合并。时间复杂度为O(logn)/** * Def...原创 2018-09-23 19:49:44 · 401 阅读 · 0 评论 -
92. 反转链表 II
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。说明:1 ≤ m ≤ n ≤ 链表长度。示例:输入: 1->2->3->4->5->NULL, m = 2, n = 4输出: 1->4->3->2->5->NULL分析:这题要求我们翻转[m, n]区间之间的链表。对于链表翻转来说,几乎都是通用的做 法,譬如 p1 -...原创 2018-09-23 19:58:37 · 368 阅读 · 0 评论 -
25. k个一组翻转链表
给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序。示例 :给定这个链表:1->2->3->4->5当 k = 2 时,应当返回: 2->1->4->3->5当 k = 3 时,应当返回: 3->2->1-...原创 2018-09-23 20:06:07 · 256 阅读 · 0 评论 -
84. 柱状图中最大的矩形
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。示例:输入: [2,1,5,6,2,3]输出: 10思路:简单的想法就是暴力法,对每个柱子左右...原创 2018-11-01 22:39:23 · 582 阅读 · 0 评论 -
24. 两两交换链表中的节点
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。示例:给定 1->2->3->4, 你应该返回 2->1->4->3.说明:你的算法只能使用常数的额外空间。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。分析:解法一:题目要求两两链表中的结点,比较好想得应该还是直接遍历整个链表list,每次swap(list->va...原创 2018-10-19 21:09:38 · 168 阅读 · 0 评论 -
19. 删除链表的倒数第N个节点
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。示例:给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.说明:给定的 n 保证是有效的。进阶:你能尝试使用一趟扫描实现吗?分析:删除倒数第n个链表结点,两种想法。解法一:正向扫描,删除倒数第n个结点,就是...原创 2018-10-14 22:08:39 · 264 阅读 · 0 评论 -
142. 环形链表 II
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。说明:不允许修改给定的链表。进阶:你是否可以不用额外空间解决此题?分析:判断链表是否有环可以用快慢指针,一个每次走两步,一个每次走一步,如果一段时间之后这两个指针能重合,那么铁定存在环了。找到重合结点的位置后,让慢指针指向头结点,然后快慢指针每次同时向后走一步,再次重合的位置就是开始入环的第一个结点。/**...原创 2018-09-22 22:20:13 · 191 阅读 · 0 评论 -
2. 两数相加
给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。你可以假设除了数字 0 之外,这两个数字都不会以零开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807设一个变量来跟踪进位,伪代码如下:1 将当...原创 2018-09-24 18:27:22 · 224 阅读 · 0 评论 -
86. 分隔链表
给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。你应当保留两个分区中每个节点的初始相对位置。示例:输入: head = 1->4->3->2->5->2, x = 3输出: 1->2->2->4->3->5分析:使用两个链表,p1和p2,以此遍历原链表,如果节点的值小于x,就...原创 2018-09-24 18:15:57 · 201 阅读 · 0 评论 -
143. 重排链表
给定一个单链表 L:L0→L1→…→Ln-1→Ln ,将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例 1:给定链表 1->2->3->4, 重新排列为 1->4->2->3.示例 2:给定链表 1->2->3->4->5, 重新排列为 1-...原创 2018-09-24 18:11:00 · 494 阅读 · 0 评论 -
61. 旋转链表
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。示例 1:输入: 1->2->3->4->5->NULL, k = 2输出: 4->5->1->2->3->NULL解释:向右旋转 1 步: 5->1->2->3->4->NULL向右旋转 2 步: 4-&am原创 2018-09-23 20:55:54 · 134 阅读 · 0 评论 -
147. 对链表进行插入排序
对链表进行插入排序。插入排序的动画演示如上。从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示)。每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中。插入排序算法:插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。重复直到所...原创 2018-09-23 20:49:05 · 240 阅读 · 0 评论 -
148. 排序链表
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。示例 1:输入: 4->2->1->3输出: 1->2->3->4示例 2:输入: -1->5->3->4->0输出: -1->0->3->4->5分析:先将链表分为两部分,然后依次递归的对链表左右两半合并排序。/**原创 2018-09-23 20:41:28 · 174 阅读 · 0 评论 -
496. 下一个更大元素 I
给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。找到 nums1 中每个元素在 nums2 中的下一个比其大的值。nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出-1。示例 1:输入: nums1 = [4,1,2], nums2 = [1,3,4,...原创 2018-07-10 12:45:25 · 755 阅读 · 0 评论 -
1075 链表元素分类(25 分)
1075 链表元素分类(25 分) 给定一个单链表,请编写程序将链表元素进行分类排列,使得所有负值元素都排在非负值元素的前面,而 [0, K] 区间内的元素都排在大于 K 的元素前面。但每一类内部元素的顺序是不能改变的。例如:给定链表为 18→7→-4→0→5→-6→10→11→-2,K 为 10,则输出应该为 -4→-6→-2→7→0→5→10→18→11。输入格式: 每个输入包含一个测...原创 2018-06-19 21:26:50 · 811 阅读 · 0 评论 -
LeetCode 21. 合并两个有序链表
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例:输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4逐个比较大小,到后面较长的链表的多余元素直接补上/** * Definition for singly-linked list. * struct...原创 2018-05-17 15:59:00 · 126 阅读 · 0 评论 -
丑数 uva156
丑数是指不能被2、3、5以外的其他素数整除的数。把丑数从小到大排列起来,结果如下:1,2,3,4,5,6,8,9,10,12,15,……求第1500个丑数。丑数的的实现方法不唯一,这道题考虑优先队列的实现,最小丑数为1,对任意丑数x,2x,3x,5x也为丑数,即用优先队列保存生成的丑数,每次取出最小的丑数,生成3个新丑数。#include#include#include#in原创 2017-12-07 20:03:38 · 278 阅读 · 0 评论 -
PAT单链表逆转
本题要求实现一个函数,将给定的单链表逆转。函数接口定义List Reverse( List L );其中List结构定义如下:typedef struct Node *PtrToNode;struct Node { ElementType Data; /* 存储结点数据 */ PtrToNode Next; /* 指向下一个结点的指针 */};原创 2017-11-19 20:43:27 · 666 阅读 · 0 评论 -
LeetCode 83. 删除排序链表中的重复元素
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。示例 1:输入: 1->1->2 输出: 1->2 示例 2:输入: 1->1->2->3->3 输出: 1->2->3/** * Definition for singly-linked list. * struct ListNode { * ...原创 2018-05-18 12:19:35 · 308 阅读 · 0 评论 -
232. 用栈实现队列
使用栈实现队列的下列操作:push(x) – 将一个元素放入队列的尾部。 pop() – 从队列首部移除元素。 peek() – 返回队列首部的元素。 empty() – 返回队列是否为空。 示例:MyQueue queue = new MyQueue();queue.push(1); queue.push(2); queue.peek(); // 返回 1 queue...原创 2018-06-02 15:34:18 · 643 阅读 · 0 评论 -
225. 用队列实现栈
使用队列实现栈的下列操作:push(x) – 元素 x 入栈 pop() – 移除栈顶元素 top() – 获取栈顶元素 empty() – 返回栈是否为空 注意:你只能使用队列的基本操作– 也就是 push to back, peek/pop from front, size, 和 is empty 这些操作是合法的。 你所使用的语言也许不支持队列。 你可以使用 list 或者...原创 2018-06-02 15:14:24 · 239 阅读 · 0 评论 -
1025 反转链表 (25)(25 分)
1025 反转链表 (25)(25 分) 给定一个常数K以及一个单链表L,请编写程序将L中每K个结点反转。例如:给定L为1→2→3→4→5→6,K为3,则输出应该为3→2→1→6→5→4;如果K为4,则输出应该为4→3→2→1→5→6,即最后不到K个元素不反转。输入格式:每个输入包含1个测试用例。每个测试用例第1行给出第1个结点的地址、结点总个数正整数N(<= 10^5^)、以及正...原创 2018-06-02 14:38:40 · 929 阅读 · 0 评论 -
206. 反转链表
反转一个单链表。示例:输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 进阶: 你可以迭代或递归地反转链表。你能否用两种方法解决这道题?迭代法:/** * Definition for singly-linked list. * struct ListNode {...原创 2018-06-01 10:57:46 · 391 阅读 · 0 评论 -
链表常见题型整理
1. 将链表进行翻转从头到尾遍历原链表,每遍历有关结点,将其摘下放在新链表的最前端。注意链表为空和只有一个结点的情况。ListNode * ReverseList(ListNode * pHead){ // 如果链表为空或只有一个结点,无需反转,直接返回原链表头指针 if(pHead == NULL || pHead->m_pNext == NULL) retur...原创 2018-06-14 13:54:37 · 371 阅读 · 0 评论 -
160. 相交链表
编写一个程序,找到两个单链表相交的起始节点。例如,下面的两个链表:A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3 在节点 c1 开始相交。注意:如果两个链表没有交点,返回 null.在返...原创 2018-05-31 14:46:20 · 471 阅读 · 0 评论 -
141. 环形链表
给定一个链表,判断链表中是否有环。进阶: 你能否不使用额外空间解决此题?可以用一个哈希表 ···cppunordered_map&lt; int,bool&gt; visited ··· 来标记每个元素是否被访问过,若某个元素被重复访问,则存在环。最好的方法是用快慢指针,快指针每次走两步,慢指针每次走一步,只要快慢指针相遇,则肯定有环。/** * Definition...原创 2018-05-30 11:35:47 · 203 阅读 · 0 评论 -
L2-002 链表去重(25 分)
L2-002 链表去重(25 分) 给定一个带整数键值的单链表L,本题要求你编写程序,删除那些键值的绝对值有重复的结点。即对任意键值K,只有键值或其绝对值等于K的第一个结点可以被保留。同时,所有被删除的结点必须被保存在另外一个链表中。例如:另L为21→-15→-15→-7→15,则你必须输出去重后的链表21→-15→-7、以及被删除的链表-15→15。输入格式:输入第一行包含链表第一个结...原创 2018-05-29 15:21:10 · 6001 阅读 · 5 评论 -
237. 删除链表中的节点
请编写一个函数,使其可以删除某个链表中给定的(非末尾的)节点,您将只被给予要求被删除的节点。比如:假设该链表为 1 -> 2 -> 3 -> 4 ,给定您的为该链表中值为 3 的第三个节点,那么在调用了您的函数之后,该链表则应变成 1 -> 2 -> 4 。 后移指针 /** * Definition for singly-linked list....原创 2018-06-03 15:22:45 · 514 阅读 · 0 评论