链表

leetcode面试题——面试题25. 合并两个排序的链表

半世苍凉 提交于 2020-03-06 15:54:08
面试题25. 合并两个排序的链表 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。 示例1: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 限制: 0 <= 链表长度 <= 1000 解题思路:设置一个虚拟头结点,分别用两个指针比较,数据小的插入新的链表,然后指针后移,新链表的当前指针同样后移,重复上述操作。最后进行细节操作。 /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode mergeTwoLists ( ListNode l1 , ListNode l2 ) { ListNode newNode = new ListNode ( 0 ) ; ListNode cur = newNode ; while ( l1 != null && l2 != null ) { if ( l1 . val > l2 . val ) { cur . next = l2 ; l2 = l2 . next ; } else { cur . next = l1 ;

LeetCode 143. 重排链表

こ雲淡風輕ζ 提交于 2020-03-06 11:55:53
题目链接: https://leetcode-cn.com/problems/reorder-list/ 给定一个单链表 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->5->2->4->3. 小结:感觉这题比较好,虽然题目简单也易理解,但是有很多常规操作,先是快慢指针,其次是逆置链表,最后是俩链表的合并。 1 void reorderList(struct ListNode* head){ 2 if(head==NULL||head->next==NULL) return head; 3 struct ListNode *slow=head,*fast=head,*q,*p,*head1,*head2; 4 while(fast->next&&fast->next->next){ 5 slow=slow->next; 6 fast=fast->next->next; 7 } 8 head1=head; 9 head2=slow->next; 10 slow->next=NULL; 11 struct

C++ STL之list容器的基本操作

时间秒杀一切 提交于 2020-03-06 11:47:56
由于list和vector同属于序列式容器,有很多相同的地方,而上一篇中已经写了vector,所以这一篇着重写list和vector的不同之处和特有之处。 特别注意 的地方: (1)STL中迭代器容器中都要注意的地方(vector中已经提到): 1)任何时候同时使用两个迭代器产生的将会是一个 前闭后开 的区间(具体见插入和删除的例子) 2)begin()指向的是vec中的第0个元素,而 end是指向最后一个元素的后面一个位置 (不是最后一个元素) 3) 迭代器的时效性 ,如果一个迭代器所指向的内容已经被删除,而后又使用该迭代器的话,会造成意想不到的后果 (2) list的迭代器是双向迭代器 (只能++ --,没有偏移功能)而不是像 vector那样的随机迭代器 (和指针几乎一样的所有功能) (3)list和vector的区别,本质区别:list是链式存储,vector在内存中是连续区别的,有本质区别而导致下面区别 1)list不支持随机访问(2)中已经说明,vector可以像数组那样使用平[]访问元素,而list是不可以的 2) list的插入和删除效率很高,所以list有push_front、pop_front、sort而vector中这些操作的效率太低了,所以STL中没有写这些功能 3)list的一些特有的函数remove、reverse、unique、splice

java基础进阶篇(七)_LinkedHashMap------【java源码栈】

别说谁变了你拦得住时间么 提交于 2020-03-06 10:31:21
目录 一.概述 二.特点 三.应用场合 四.构造方法 1.参数为空 2.accessOrder 五.源码结构分析 六.常见问题 1.如何实现的元素有序? 2.如何保证顺序的正确以及同步 3.如何实现两种顺序(插入顺序或者访问顺序)? 4.为什么重写containsValue()而不重写containsKey()? 七.常用方法 一.概述   LinkedHashMap是HashMap的子类,关于HashMap可以看下前面的章节: java基础进阶篇 HashMap public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V> 二.特点 非线程安全 LinkedHashMap 内部保证顺序; 分插入顺序和访问排序两种, 如果是访问顺序,那put和get操作已存在的Entry时,都会把Entry移动到双向链表的表尾(其实是先删除再插入)。 HashMap不保证插入顺序. LinkedHashMap存取数据,还是跟HashMap一样使用的Entry[]的方式,双向链表只是为了保证顺序。 LinkedHashMap是继承于HashMap,是基于HashMap和双向链表来实现的。 LinkedHashMap的插入顺序和访问顺序可以由开发者自己决定. 三.应用场合   HashMap是无序的,当我们希望有顺序(

leetcode 23. 合并K个排序链表

瘦欲@ 提交于 2020-03-06 09:04:01
本质上就是用优先队列来做,但是考虑的问题是 如何重载 cmp 比较函数 参考网络上的写法 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* mergeKLists(vector<ListNode*>& lists) { auto cmp = [](ListNode* &a, ListNode* &b) { return a->val > b->val; }; priority_queue<ListNode*, vector<ListNode*>, decltype(cmp)> que(cmp); for (auto node : lists) if (node) que.push(node); ListNode *first = new ListNode(-1); ListNode *res = first; while (!que.empty()) { ListNode *a = que.top(); que.pop(); first->next = a; first = first-

C++实现企业链表(单向链表的另外一种实现方式)

北战南征 提交于 2020-03-06 08:52:29
LinkList.h #include <windows.h> #include <stdio.h> // 链表小结点 typedef struct LINKNODE { LINKNODE* next; }LinkNode; // 链表结点 typedef struct LINKLIST { LinkNode head; int size; }LinkList; // 遍历结点的函数指针 typedef void(*PRINTLINKNODE)(LinkNode*); // 比较函数指针 typedef int(*COMPARENODE)(LinkNode*, LinkNode*); // 初始化链表 LinkList* Init_LinkList(); // 根据位置插入语一个结点 void Insert_LinkList(LinkList* list, int pos, LinkNode* data); // 根据位置删除一个结点 void RemoveByPos_LinkList(LinkList* list, int pos); // 查找结点 int Find_LinkList(LinkList* list, LinkNode* data, COMPARENODE compare); // 返回链表的大小 int Size_LinkList(LinkList* list)

链表的实现(类模板)

心不动则不痛 提交于 2020-03-06 07:22:38
上一篇文章的链表实现有点小问题,此处使用类模板再做描述,不过部分代码有所不同。 #include<iostream> #include<cstdlib> #include<cstdio> using namespace std; template<class T> class LinkList; //类的声明 template<class T> class ListNode{ //由于结构体不太便于描述,故此处使用类来描述结点 public: friend class LinkList<T>; //为了使LinkList类能访问该类的私有变量,应将其设为ListNode的友元类 //friend void f(); private: T data; ListNode<T>* next; }; template<class T> class LinkList{ public: LinkList(){head = NULL;} //构造函数,初始化链表 ~LinkList(){}; //析构函数 bool ListEmpty(){return head == NULL;} int ListLength(); //求链表长度 void CreateListF(); //头插法构造链表 void CreateListR(); //尾插法构造链表 void CreateList(); /

快慢指针

℡╲_俬逩灬. 提交于 2020-03-06 06:03:22
快慢指针 快慢指针中的快慢指的是移动的步长,即每次向前移动速度的快慢。 例如可以让快指针每次沿链表向前移动2,慢指针每次向前移动1次。 快慢指针的应用 (1)判断单链表是否存在环 如果链表存在环,就好像操场的跑道是一个环形一样。此时让快慢指针都从链表头开始遍历,快指针每次向前移动两个位置,慢指针每次向前移动一个位置;如果快指针到达NULL,说明链表以NULL为结尾,没有环。如果快指针追上慢指针,则表示有环。代码如下: bool HasCircle(Node *head) { if(head == NULL) return false; Node *slow = head, *fast = head; while(fast != NULL && fast->next!=NULL) { slow = slow->next; //慢指针每次前进一步 fast = fast->next->next;//快指针每次前进两步 if(slow == fast) //相遇,存在环 return true; } return false; } (2)在有序链表中寻找中位数 快指针的移动速度是慢指针移动速度的2倍,因此当快指针到达链表尾时,慢指针到达中点。 程序还要考虑链表结点个数的奇偶数因素,当快指针移动x次后到达表尾(1+2x),说明链表有奇数个结点,直接返回慢指针指向的数据即可。

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的

橙三吉。 提交于 2020-03-06 04:44:08
public ListNode mergeTwoLists(ListNode l1,ListNode l2){ if(l1 null){ return l2; } if(l2 null){ return l1; } ListNode newhead=null; ListNode newTail=null; ListNode cur1=l1; ListNode cur2=l2; while(cur1!=null&&cur2!=null){ if(cur1.val<cur2.val){ if(newTail null){ newhead=cur1; newTail=cur1; }else{ newTail.next=cur1; newTail=newTail.next; } cur1=cur1.next; }else{ if(newTail null){ newhead=cur2; newTail=cur2; }else{ newTail.next=cur2; newTail=newTail.next; } cur2=cur2.next; } } if(cur1==null){ newTail.next=cur2; }else{ newTail.next=cur1; } return newhead; } 来源: CSDN 作者: keithendnasjkf 链接: https:/

跨越算法开篇

对着背影说爱祢 提交于 2020-03-06 00:25:01
数据结构与算法是编程的基本功,当你算法掌握越来越深的时候你会发现写代码的时候,会不由自主考虑很多性能方面的问题。写出时间复杂度高、空间复杂度高的垃圾代码越来越少了,算法能力提升了很多,编程能力也有了质的飞跃。 首先一个三连问。 是不是从学校开始,你就觉得数据结构难学,然后一直没认真学? 工作中,一遇到数据结构这个坑,你又发自本能地迅速避让,因为你觉得自己不懂,所以也不想深究,反正看起来无关大局? 当你想换工作面试,或者研究某个开源项目源码,亦或者和团队讨论某个非框架层面的高可用难题的时候,你又发现,自己的基础跟不上别人的节奏? 如果你有这种情况,其实你并不孤独。这不是你一个人遇到的问题。工作十间,见过许多程序员。他们有着各种各样的背景,有很多既有潜力又非常努力,但始终无法在自己现有水平上更进一步。少年不要慌,青叶带你跨越算法这道坎。 在技术圈里,我们经常喜欢谈论高大上的架构,比如高可用、微服务、服务治理等等。鲜有人关注代码层面的编程能力,而愿意沉下心来,花几个月时间啃一啃计算机基础知识、认认真真夯实基础的人,简直就是凤毛麟角。 基础知识就像是一座大楼的地基,它决定了我们的技术高度。而要想快速做出点事情,前提条件一定是基础能力过硬,“内功”要到位 。 那技术人究竟都需要修炼哪些“内功”呢?我觉得,无外乎就是大学里的那些基础课程,操作系统、计算机网络、编译原理等等