![](https://img-blog.csdnimg.cn/20190918140053667.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
链表问题
北大人工智能yjt
像写自然语言一样编码.
展开
-
leetcode2_两数相加_链表
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode*...原创 2020-04-06 23:02:08 · 168 阅读 · 0 评论 -
leetcode876_链表的中间节点
一. 迭代.1. 时间O(n), 空间O(1)./** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solu...原创 2020-02-17 16:52:54 · 118 阅读 · 0 评论 -
leetcode234_回文链表
一. 迭代1. 边移动快慢指针边反转链表的前半部分,等找到链表中点,再将前半部分与后半部分依次比较,判断是否为回文链表.//大佬的思路, 反转后半部分.class Solution {public: //题解:快慢指针法,快指针走两步,慢指针走一步,找到链表的中点。然后,翻转后半部分。最后从头、中点开始判断是否相同。 bool isPalindrome(ListNod...原创 2020-02-17 16:44:10 · 141 阅读 · 0 评论 -
leetcode206_反转链表_迭代+递归
一. 迭代1. 有pre, cur还要保存cur->next.class Solution {public: ListNode* reverseList(ListNode* head) { if(head==NULL || head->next==NULL) return head; //前驱指针,cur需要指向它. ...原创 2020-02-16 23:24:06 · 111 阅读 · 0 评论 -
leetcode141_重排链表
一.迭代1. 将链表转换为数组,然后用双指针分别取出头尾指针.2. 相当于耍赖用数组转化链表./** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL...原创 2020-02-16 16:53:54 · 171 阅读 · 0 评论 -
leetcode142_环形链表||
一. 参考 leetcode141_环形链表_双指针https://blog.csdn.net/qieyuan4083/article/details/104336903二. 哈希表,第一个重复的即为环的入口.时间O(n),空间O(n).三. Floyd算法.第一阶段,找到链表是否有环,有环的话再找到相遇节点./** * Definition for singly-linke...原创 2020-02-16 00:15:43 · 78 阅读 · 0 评论 -
leetcode141_环形链表_双指针
一. 用哈希存储已经访问过的链表节点,如果有重复,则有环, 否则检测到链表末尾则无环.二. 双指针.1. 使用不同速度快慢指针,空间复杂度O(1)./** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode...原创 2020-02-15 23:49:37 · 121 阅读 · 0 评论 -
leetcode138_复制带随机指针的链表
一. 回溯1. 当random访问了一个新的节点,需要创建它, 否则直接返回旧的指针就好.2. 特别注意,哈希表中传入的都是指针,所以一定会是Node*类型,而不是Node./*// Definition for a Node.class Node {public: int val; Node* next; Node* random; ...原创 2020-02-15 19:04:19 · 177 阅读 · 0 评论 -
leetcode109_有序链表转换二叉搜索树
一. 思路应该和leetcode108_将有序数组转换为二叉搜索树差不多, 但是需要找中点, 没数组高效, 看题解如何处理.作者:LeetCode链接:https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/solution/you-xu-lian-biao-zhuan-huan-er-cha-so...原创 2019-10-20 21:45:47 · 152 阅读 · 0 评论 -
leetcode92_翻转链表||_递归
一. 递归1. 参考这个作者写的太好了,包括解决反转链表的所有思路.作者:labuladong链接:https://leetcode-cn.com/problems/reverse-linked-list-ii/solution/bu-bu-chai-jie-ru-he-di-gui-di-fan-zhuan-lian-biao/2. 这题是反转m到n区间的链表,如果将head移...原创 2020-02-15 11:12:31 · 175 阅读 · 0 评论 -
leetcode61_旋转链表
一. 迭代1. 先将链表闭合成环.2.找到相应的位置断开这个环.class Solution {public: ListNode* rotateRight(ListNode* head, int k) { //边界条件. if(head==NULL || head->next==NULL || k==0) return head;...原创 2020-02-14 17:42:09 · 111 阅读 · 0 评论 -
leetcode24_两两交换链表中的节点_递归
一. 递归1. 真正的交换节点的意思就是1->2变为2->1.2. 时间O(n), 空间O(n), 递归过程使用堆栈空间./** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x)...原创 2020-02-14 16:19:31 · 221 阅读 · 0 评论 -
leetcode21_合并两个有序链表_迭代+递归
一. 递归1. 两个链表较小的元素与剩下的元素merge并合并.2. 时间复杂度O(n+m). 空间也为O(n+m). 有n+m个帧栈.class Solution {public: //函数mergeTwoLists的作用是返回合并好的链表的头结点. ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { ...原创 2020-02-14 11:07:24 · 244 阅读 · 0 评论 -
leetcode19_删除链表的倒数第N个节点_链表_双指针_递归
1. 最简单的想法就是先求出链表的长度len,再找到(len-k)个节点,即删除节点的前一个节点,就可以将其删除.2. 两次遍历./** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val...原创 2020-02-14 09:33:22 · 173 阅读 · 0 评论 -
leetcode2_两数相加_链表
1. 用carry来每次更新进位.2. 考虑特殊情况, [0,1]和[0,1,2], []和[0,1], [1]和[9,9], 即额外的进位./** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x)...原创 2020-02-13 21:48:03 · 135 阅读 · 0 评论 -
leetcode83_删除排序链表中的重复元素_趁热打铁
一. 和leetcode82题思路一样,分为递归和非递归.二. 递归写法.struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {}};//递归写法,和82题思路一样.class Solution {public: ListNode* deleteDup...原创 2019-10-04 15:34:37 · 77 阅读 · 0 评论 -
leetcode61_旋转链表
一. 这题第一眼看到的思路是找到链表倒数第k个节点的位置,从这个位置连接链表前面的部分,从而完成旋转链表.//通过测试class Solution {public: ListNode* rotateRight(ListNode* head, int k) { //判断初始条件,注意当k==0时,不需要旋转链表. if (head == NULL || head->nex...原创 2019-10-06 16:11:12 · 94 阅读 · 0 评论 -
leetcode86_分隔链表
一. 最近老是写题不顺,看来得下点功夫了......二. 直接参考官方题解......作者:LeetCode链接:https://leetcode-cn.com/problems/partition-list/solution/fen-ge-lian-biao-by-leetcode/1. 看到链表就要想到双指针法或者递归, 果不其然......2. 双指针法:直觉:...原创 2019-10-07 19:25:25 · 107 阅读 · 0 评论 -
打印两个有序链表的公共部分
一. 参考左程云大神的书,程序员代码面试指南......#include <iostream>using namespace std;struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {}};void printCommonPart(ListN...原创 2019-10-11 16:53:07 · 280 阅读 · 0 评论 -
leetcode82_删除排序链表中的重复元素2_快慢指针+递归
一. 链表的解法有两种常见的,一个是递归写法,一个是非递归写法.二. 首先展示一下递归写法,递归写法的关键是明确函数的作用,然后假设此函数已经实现了这个功能,去推断下一个状态是怎么样的.1. 本题中deleteDuplicates函数的作用是返回已经删除链表中重复元素的头指针.假设这个函数可以完成功能.struct ListNode { int val; ListNo...原创 2019-10-04 12:37:33 · 141 阅读 · 0 评论