链表

21. 合并两个有序链表

限于喜欢 提交于 2020-02-05 10:42:47
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例: 输入: 1->2->4, 1->3->4 输出: 1->1->2->3->4->4 思路: 两个指针分别指向待比较的结点,不断比较插入到新的链表中,直到其中一个链表为空,将另一个链表剩下的所有结点全部插入到新链表,返回新链表。 题解: /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public : ListNode * head = ( ListNode * ) malloc ( sizeof ( ListNode ) ) ; ListNode * p = head ; ListNode * mergeTwoLists ( ListNode * l1 , ListNode * l2 ) { while ( l1 != NULL && l2 != NULL ) { if ( l1 - > val < l2 - > val ) { p - > next = l1 ; l1 = l1 - > next ; } else {

leetcode解题之环形链表

允我心安 提交于 2020-02-05 10:36:33
给定一个链表,判断链表中是否有环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 示例 1: 输入:head = [3,2,0,-4], pos = 1 输出:true 解释:链表中有一个环,其尾部连接到第二个节点。 示例 2: 输入:head = [1,2], pos = 0 输出:true 解释:链表中有一个环,其尾部连接到第一个节点。 示例 3: 输入:head = [1], pos = -1 输出:false 解释:链表中没有环。 进阶: 你能用 O(1)(即,常量)内存解决此问题吗? 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/linked-list-cycle 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 想的比较简单,使用Object对象作为键保存链表中的节点,然后查找节点在map中是否存在,如果存在链表中就存在环 /** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * }

选择排序

冷暖自知 提交于 2020-02-05 09:45:01
文章目录 内存的工作原理 数组和链表 读取 插入删除 选择排序 问题: 示例代码 内存的工作原理 计算机内存犹如一大堆抽屉,每个抽屉( 内存单元 )都有地址。 将数据存储到内存时,你请求计算机提供存储空间,计算机给你一个存储地址。需要存储多项数据时,有两种基本方式—— 数组 和 链表 。 数组和链表 数组的元素都在一起,即在内存中都是相连的。 在同一个数组中,所有元素的类型都必须相同(都为int、double等)。 链表的元素是分开的,其中每个元素都存储了下一个元素的地址。 读取 数组的 读取 速度很 快 ,因为你 知道其中每个元素的地址 ,支持 随机访问 ;链表只能 顺序访问 ,比如在需要读取链表的最后一个元素时,你不能直接读取,因为你 不知道它所处的地址 ,必须先访问元素#1,从中获取元素#2的地址,再访问元素#2并从中获取元素#3的地址,以此类推,直到访问最后一个元素。需要同时读取所有元素时,链表的效率很高:你读取第一个元素,根据其中的地址再读取第二个元素,以此类推。但如果你需要跳跃,链表的效率真的很低。 插入删除 链表的插入和删除速度很快。插入元素时,只需将其放入内存,并将其地址存储到前一个元素中。 在数组中添加新元素可能很麻烦。如果没有了空间,就得移到内存的其他地方,因此添加新元素的速度会很慢;如果需要在中间插入元素,则必须将后面的元素都向后移。 时间复杂度为 O ( n

第3章 栈和队列

。_饼干妹妹 提交于 2020-02-05 09:01:48
3.1 栈的定义及抽象数据类型 栈(stack)是一种特殊的线性表,这种表只能在固定的一端进行插入与删除运算。通常称固定插入、删除的一端为栈顶(top),而另一端称为栈底(bottom)。位于栈顶和栈底的元素分别称为顶元和底元。当表中没有元素时,称为空栈。为了与一般的线性表相区别,通常将栈的插入操作称为入栈,将删除操作称为出栈。 线性表S=(a,b,c,d,e) 将S中的元素按照a、b、c、d、e的顺序依次入栈,则出栈的元素顺序为e、d、c、b、a 可以发现,最先进入栈中的元素a最后才出栈,最后入栈的元素e最先被出栈,因为栈的这一特性,故又将其称为后进先出的线性表(lastinfirstout,简称为LIFO)。 3.2 栈的实现 栈的实现既可以采用顺序存储结构也可以采用链式存储结构。采用顺序存储结构实现的栈称为顺序栈,采用链式存储结构实现的栈称为链栈 3.2.1 顺序栈 栈的初始化操作是指按指定的大小为栈动态分配一片连续的存储区,并将该存储区的首地址同时送给栈顶指针top和栈底指针base,表示栈里没有任何元素,此时的栈为空栈。若base的值为NULL时则表明栈不存在。当插入一个新元素时栈顶指针加1,当删除一个元素时栈顶指针减1。栈顶指针top始终比顶元超前一个位置,因此栈满的条件是top-base=stacksize。图3-3所示为栈顶指针和栈中元素的关系。 值得注意的是

两个链表的第一个公共节点

本秂侑毒 提交于 2020-02-05 07:59:24
今天刷题碰到一个神仙解法,真是溜,记录一下: 长度相同有公共结点,第一次就遍历到;没有公共结点,走到尾部NULL相遇,返回NULL 长度不同有公共结点,第一遍差值就出来了,第二遍一起到公共结点;没有公共,一起到结尾NULL。 例如:当两个链表长度不同有公共节点时,bc+cd+ac = ac+cd+bc,所以第二遍时一定会一起到达公共节点 /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { public: ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) { ListNode *p1 = pHead1; ListNode *p2 = pHead2; while(p1!=p2){ p1 = (p1==NULL ? pHead2 : p1->next); p2 = (p2==NULL ? pHead1 : p2->next); } return p1; } }; 来源: https://www.cnblogs.com/roscangjie/p/11136149.html

求两个链表的第一个公共节点(建模有趣)

拟墨画扇 提交于 2020-02-05 07:58:24
题目描述: 析:本题如果采用暴力遍历方法的话,最大时间复杂度为O((m + n)* (l + n)) 其实这道题可以建模成一个相遇问题,如上图所示:A和B同时出发,速度均为1,求他们的相遇点p,很明显,当行走路程达到(m + n + l)时,两者路程相同,相遇,代码如下: /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { public: ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) { ListNode* p1 = pHead1; ListNode* p2 = pHead2; while(p1 != p2) { p1 = (p1 == NULL ? pHead2 : p1 -> next); p2 = (p2 == NULL ? pHead1 : p2 -> next); } return p1; } }; 来源: https://www.cnblogs.com/zf-blog/p/9956602.html

链表之有头链表

淺唱寂寞╮ 提交于 2020-02-05 06:35:27
//有头链表 #include <stdio.h> #include <string.h> #include <malloc.h> #define N sizeof(struct student) struct student { char name[20]; int num; int score; struct student * next; }; struct student * creat_list(int n); void print_list(struct student* head); void add_list(struct student* head); void delete_list(struct student* head); void sort_list(struct student* head); int main (void) { struct student * Head; int n; scanf("%d",&n); //输入你需要创建链表的长度 Head=creat_list(n);//返回头结点的地址 创建链表 print_list(Head); //发送头节点的地址 输出链表 add_list(Head); //发送头节点的地址 插入 delete_list(Head); //发送头节点的地址 删除 sort_list(Head); /

java的LinkedList介绍及常用方法

笑着哭i 提交于 2020-02-05 06:00:45
LinkedList : LinkedList是链表的结构。LinkedList与ArrayList一样实现List接口,只是ArrayList是List接口的大小可变数组的实现,LinkedList是List接口链表的实现。基于链表实现的方式使得LinkedList在插入和删除时更优于ArrayList,而随机访问则比ArrayList逊色些。LinkedList访问比较慢我,必须从第一个元素开始遍历。LinkedList是链表的结构。 LinkedList的常用方法 add(E e) 将指定元素添加到此列表的结尾。 add(int index, E element) 在此列表中指定的位置插入指定的元素。 addAll(int index, Collection<? extends E> c) 将指定 collection 中的所有元素从指定位置开始插入此列表。 addFirst(E e) 将指定元素插入此列表的开头。 addLast(E e) 将指定元素添加到此列表的结尾。 clear() 从此列表中移除所有元素。 contains(Object o) 如果此列表包含指定元素,则返回 true。 get(int index) 返回此列表中指定位置处的元素。 indexOf(Object o) 返回此列表中首次出现的指定元素的索引,如果此列表中不包含该元素,则返回 -1。

题19、删除链表的倒数第N个节点

人走茶凉 提交于 2020-02-05 03:18:55
一、题目 1 二、思路 将当前循环节点的前n个节点存储下来,在遍历完成之后直接进行处理。 注意:1、长度为0,1;2、删除节点为第一个、倒数第一个、第二个、倒数第二个;特殊情况的处理。 三、代码 public class T0019 { public static void main ( String [ ] args ) { int [ ] nums = { 1 , 2 , 3 , 4 , 5 } ; // int[] nums = {1}; ListNode head = new ListNode ( nums [ 0 ] ) ; ListNode node = head ; for ( int i = 1 ; i < nums . length ; i ++ ) { node . next = new ListNode ( nums [ i ] ) ; node = node . next ; } node = removeNthFromEnd ( head , 5 ) ; while ( node != null ) { System . out . println ( node . val ) ; node = node . next ; } } public static ListNode removeNthFromEnd ( ListNode head , int n

第九篇:队列的学习,用数组和链表实现单向队列

ぃ、小莉子 提交于 2020-02-05 03:02:42
线性表 前面我们学习了链表的相关知识,今天我们接着来学习另外一种数据结构-----》队列。其实,不管是数组还是链表,都是属于线性表,那么什么是线性表呢?线性表是具有相同数据类型的n(n>=0)个数据元素的有限序列。其中n为表长,当n=0时,该线性表是一个空表。若用 L 命名线性表,则其一般表示如下: L = ( a1 , a2 , a3 , … , a(i) , a( i + 1) , … , a(n) ) 其中,a1 是唯一的 “ 第一个 ” 数据元素,又称为表头元素;a(n) 是唯一的 “ 最后一个 ” 数据元素, 又称为表尾元素。除了第一个元素外,每个元素有且仅有一个直接前驱。除最后一个元素外 ,每个 元素 有且仅有一个直接后继。以上就是线性表的逻辑特性,这种线性表有序的逻辑结构正是线性表 名字的由来。 队列 队列,是一种操作受限,先进先出的的线性表数据结构,其只有入队enqueue和出队dequeue两个操作。我们可以用数组和链表来实现队列。用数组实现的是顺序队列,用链表实现的是链式队列。 数组实现队列的逻辑 队列有两个指针,分别是队头指针head和队尾指针tail。队头的指针指向队列的头部。例如: 我们定义一个大小为6的数组,然后,以及将 a,b,c,d 入队。那么过程变化图如下: 如上图,我们可以清楚的看出队列入队的话就是tail指针不断向后移动