
链表
重you小垃
这个作者很懒,什么都没留下…
展开
-
leetcode203.移除链表元素(简单)
递归写法:class Solution {public: ListNode* removeElements(ListNode* head, int val) { if (head == nullptr) { return head; } if (head->val == val) { return removeElements(head->next, val); }els.原创 2021-09-25 19:22:02 · 83 阅读 · 0 评论 -
leetcode19.删掉倒数第n个结点
直接思路:扫描一遍链表看一下有多长,然后移动到指定节点删掉即可。进阶:一遍扫描实现!!做法1:扫描一遍放入栈中,出栈的第n个即为删除的节点,栈顶的节点为删除结点的前驱结点(空间复杂度会高一点)。做法2:双指针,fast指针比slow指针快n个节点,然后同时移动,当fast指针移动到最后时,slow刚好移动到指定位置,删结点即可。class Solution {public: ListNode* removeNthFromEnd(ListNode* head, int n) { .原创 2021-01-21 22:44:37 · 112 阅读 · 1 评论 -
leetcode2.两数相加
思路:对两个链表进行遍历,加法模拟即可。class Solution {public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { ListNode *p = l1, *q = l2, *result = new ListNode, *r = result; int num = 0, add = 0; ListNode *temp = NULL; while (..原创 2021-01-21 21:26:49 · 119 阅读 · 0 评论 -
leetcode148 排序链表(归并排序,两种实现方式)
尝试一:拷贝到一个vector中,先排好序再赋值,超出内存限制。。。。尝试二:冒泡排序,超时。。。。解法一:这道题考虑时间复杂度更低的排序算法。题目的进阶问题要求达到 O(nlogn) 的时间复杂度和 O(1)的空间复杂度,时间复杂度是O(nlogn) 的排序算法包括归并排序、堆排序和快速排序(快速排序的最差时间复杂度是 O(n^2),其中最适合链表的排序算法是归并排序。归并排序基于分治算法。最容易想到的实现方式是自顶向下的递归实现,考虑到递归调用的栈空间,自顶向下归并排序的空间复杂度是O(log.原创 2021-01-21 20:54:54 · 179 阅读 · 0 评论 -
leetcode234.回文链表(栈,递归,链表逆序)
第一种方法:都放入数组中,双指针从两边向中间扫描对比,空间复杂度O(n)第二种方法:第一次扫描放入栈中,第二次扫描的时候与出栈的元素对比,空间复杂度O(n)第三种方法:递归,空间复杂度O(n)...原创 2020-12-27 11:24:56 · 200 阅读 · 0 评论 -
leetcode206.反转链表(递推,递归)
第一种:栈,空间复杂度O(N)第二种:迭代,也就是双指针,空间复杂度O(1)class Solution {public: ListNode* reverseList(ListNode* head) { // 1->2->3->4->null 结果是 4->3->2->1->null //迭代的思想: 双指针,r指针用来保存q后面的结点,把q方向由r改为p,然后不断后移 //空间 O(1)!! .原创 2020-12-18 10:47:12 · 186 阅读 · 0 评论 -
leetcode142.环形链表2(中等)
第一种做法:哈希表(空间复杂度n),之前141题做过了,就不讨论了。第二种做法(思路!!):思路:一个fast指针一次移动2步,一个slow指针一次移动1步,同时从起点出发,他们第一次相遇一定在slow指针的第一圈,因为当slow指针移动到一半的时候,fast已经移动到了一圈多,最极端的情况就是在最后的结点相遇。从slow该相遇节点出发一次移动一个位置,fast从头部开始出发一次移动一个位置,相遇的位置就是入口!!注意必须都从起点出发!!证明如下(可以不看):class Solution...原创 2020-12-17 17:35:05 · 101 阅读 · 0 评论 -
leetcode141.环形链表(简单)
第一种方法:指针一直往后移动,最多只有10000个结点,如果移动次数大于9999,则代表有环,最笨的方法,时间复杂度高,不推荐!!class Solution {public: bool hasCycle(ListNode *head) { if (head == NULL || head->next == NULL) return false; int count = 0; while (head != NULL){ ...原创 2020-12-17 11:29:29 · 110 阅读 · 0 评论 -
leetcode160.相交链表(相遇,数学双指针)
class Solution {public: ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { //题目的意思是找相同的结点,并不是找值相同的结点!!! //思路:a+b+c=c+b+a!!!很巧妙,一轮就可以相遇!!! if (headA == NULL || headB == NULL) return NULL; ListNode *p =...原创 2020-12-16 20:51:17 · 104 阅读 · 0 评论 -
leetcode21.合并两个有序链表
class Solution {public: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { //LeetCode中的链表不带头结点 //思路:以其中的一条链为主链,将另外一条链的每个结点插入这条主链中,直到所有的结点被插进去为止。 ListNode *p, *temp; if (l1 == NULL) return l2; if (l2 == NULL).原创 2020-12-15 22:42:20 · 152 阅读 · 0 评论 -
链表增删改查
/* 链表(带头结点,c++): 1.新建链表,插入数组中的元素 2.插入指定元素在第pos位置上 3.查找指定元素 4.删除指定元素*/#include <cstdio>struct node{ int in; node *next;};node *create(int a[]); //新建链表 node *find(node *head, int x); //查找元素void insert(node *head, int pos, int x); //插入元素原创 2020-12-15 20:10:19 · 171 阅读 · 0 评论