草庐IT

代码随想录算法训练营第四天|24、两两交换链表中的节点|19、删除链表的倒数第N个节点|面试题02.07.链表相交|142、环形链表Ⅱ

tinct 2023-03-28 原文

24、两两交换链表中的节点

·模拟节点交换


题目链接:https://leetcode.cn/problems/swap-nodes-in-pairs/

思路:循环中两两交换
   手写模拟一下交换的过程就比较容易了
   下图是我写的模拟过程:


代码实现:中规中矩地模拟就完事
     时间复杂度O(n)
     空间复杂度O(1)

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode* cur =head;
        ListNode* per =new ListNode();
        ListNode* k = new ListNode();
        bool t=false;
        while(cur!=nullptr&&cur->next!=nullptr){//有可以进行交换的节点
            k=cur->next;//per要指向cur->next,先用k存cur->next
            cur->next=k->next;//改变cur的指针域
            per->next=k;
            per=per->next;
            per->next=cur;
            if(!t){//注意,当头两个节点进行交换后,head也需要进行交换
                head=per;
                t=true;
            }
            per=cur;
            cur=cur->next;          
        }
        return head;
    }
};

收获摘要:carl哥的方法用了虚拟头节点,我没用虚拟头节点,写下来还比较顺畅,就是要注意返回的head因为交换,要改变。

学习的文章链接:https://programmercarl.com/0024.两两交换链表中的节点.html#_24-两两交换链表中的节点

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

·链表长度计算,双指针更快


单链表倒着数真是吃饱没事干,正着数再减一减就可以了

题目链接:https://leetcode.cn/problems/remove-nth-node-from-end-of-list/

思路:先计算链表的总长度
   然后算出正着数是第几个
   删除节点

代码实现:
     时间复杂度O(n)
     空间复杂度O(1)

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        int m=1;//计数器
        ListNode* phead=new ListNode(0,head);//虚拟头节点
        ListNode* cur=phead->next;
        while(cur->next!=nullptr){//计算链表长度
            cur=cur->next;
            m++;
        }
        m=m-n;//从左至右第m个
        cur=phead;
        while(m>0){
            cur=cur->next;
            m--;
        }
        ListNode* d=cur->next;
        cur->next=cur->next->next;
        delete d;
        return phead->next;
    }
};

收获摘要:设置虚拟头节点方便处理针对头节点的情况,
     比如删掉头节点后,就不能返回头节点,
     但是可以返回虚拟头节点的指针域doge

     此题用双指针法可以只扫一遍链表,类似于滑块doge
     双指针yyds!精简了计算666
     ps:双指针的代码可以在文章链接里参考,就不ctrl+v了哈哈哈
     复习的时候可以用双指针实现

学习的文章链接:https://programmercarl.com/0019.删除链表的倒数第N个节点.html#_19-删除链表的倒数第n个节点

面试题02.07.链表相交

·世界线收束doge


就是说收束前两条链表不一样长~

题目链接:https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/

前提:不存在环
   相交点不是数值相等,而是指针(节点)相等

思路:算出两条链表的长度
   两条链表相交节点之后的长度相等
   进行一个右对齐的操作,然后往后找相交节点

代码实现:
     时间复杂度O(n)
     空间复杂度O(1)

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode* curA=new ListNode(0,headA);
        ListNode* curB=new ListNode(0,headB);
        int la=0;
        int lb=0;
        int l;
        while(curA->next!=NULL){
            curA=curA->next;
            la++;
        }
        curA=headA;
        while(curB->next!=NULL){
            curB=curB->next;
            lb++;
        }
        curB=headB;
        l=(la>lb)?la:lb;
        for(int i=1;i<=l;i++){
            if(curA==curB){
                return curA;
            }
            else if(la>lb){
                curA=curA->next;
                la--;
            }
            else if(la<lb){
                curB=curB->next;
                lb--;
            }
            else{
                curA=curA->next;
                curB=curB->next;
            }
        }
        return NULL;
    }
};

收获摘要:虚拟头节点方便考虑头节点的情况(梅开n度),
     链表长度不一样就把它拉到一样,然后就一路畅通了。

学习的文章链接:https://programmercarl.com/面试题02.07.链表相交.html#思路

142、环形链表Ⅱ

·双指针+一些数学运算


他跑、她走,她被追~此处应有bgm:恋爱循环doge

题目链接:https://leetcode.cn/problems/linked-list-cycle-ii/

思路:双指针,一快一慢
   每次快指针比慢指针还要快一步 (just one)
   快指针先进入循环(循环ing)
   直到两个指针相遇(!!)
   经过一些数学运算
   请返回:循环入口

代码实现:
     时间复杂度O(n)
     空间复杂度O(1)

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        int xy=0;
        ListNode* fast=head;
        ListNode* slow=head;
        if(head==NULL)return NULL;
        while(fast->next!=NULL&&fast->next->next!=NULL){
            fast=fast->next->next;
            slow=slow->next;
            xy++;
            if(slow==fast){//两个指针相遇了
                slow=head;//一个退回原点,另一个从相遇节点继续循环
                while(slow!=fast){
                    fast=fast->next;
                    slow=slow->next;
                }
                return slow;//再相遇就是循环入口节点
            }
        }
        return NULL;
    }
};

收获摘要:双指针yyds(这句话我已经说了千百遍~)
     理解 x:头节点-循环入口节点
        y:循环入口节点-相遇节点
        z:相遇节点-循环入口节点
     双指针走过的路程以及这三个数之间的关系
     还有一点需要注意的是:
        当头节点为NULL时,它肯定不能循环,甚至不是个链表,直接返回NULL即可。

学习的文章链接:https://programmercarl.com/0142.环形链表II.html#思路

学习的视频链接:https://www.bilibili.com/video/BV1if4y1d7ob/?spm_id_from=333.788&vd_source=c2b246a405f861a2b3c13ab2b1b1eea6


学习时长:5h

有关代码随想录算法训练营第四天|24、两两交换链表中的节点|19、删除链表的倒数第N个节点|面试题02.07.链表相交|142、环形链表Ⅱ的更多相关文章

  1. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  2. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

  3. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  4. ruby - 如何安全地删除文件? - 2

    在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?

  5. ruby-on-rails - 标准化文件名的字符串,删除重音和特殊字符 - 2

    我正在尝试找到一种方法来规范化字符串以将其作为文件名传递。到目前为止我有这个:my_string.mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n,'').downcase.gsub(/[^a-z]/,'_')但第一个问题:-字符。我猜这个方法还有更多问题。我不控制名称,名称字符串可以有重音符、空格和特殊字符。我想删除所有这些,用相应的字母('é'=>'e')替换重音符号,并将其余的替换为'_'字符。名字是这样的:“Prélèvements-常规”“健康证”...我希望它们像一个没有空格/特殊字符的文件名:“prelevements_routin

  6. 区块链之加解密算法&数字证书 - 2

    目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非

  7. ruby-on-rails - 为什么在 Rails 5.1.1 中删除了 session 存储初始化程序 - 2

    我去了这个website查看Rails5.0.0和Rails5.1.1之间的区别为什么5.1.1不再包含:config/initializers/session_store.rb?谢谢 最佳答案 这是删除它的提交:Setupdefaultsessionstoreinternally,nolongerthroughanapplicationinitializer总而言之,新应用没有该初始化器,session存储默认设置为cookie存储。即与在该初始值设定项的生成版本中指定的值相同。 关于

  8. ruby - 如果它是标点符号,我怎么能从字符串中删除最后一个字符,在 ruby​​ 中? - 2

    啊,正则表达式有点困惑。我正在尝试删除字符串末尾所有可能的标点符号:ifstr[str.length-1]=='?'||str[str.length-1]=='.'||str[str.length-1]=='!'orstr[str.length-1]==','||str[str.length-1]==';'str.chomp!end我相信有更好的方法来做到这一点。有什么指点吗? 最佳答案 str.sub!(/[?.!,;]?$/,'')[?.!,;]-字符类。匹配这5个字符中的任何一个(注意,。在字符类中并不特殊)?-前一个字符或组

  9. 键删除后 ruby​​ 哈希内存泄漏 - 2

    你好,我无法成功如何在散列中删除key后释放内存。当我从哈希中删除键时,内存不会释放,也不会在手动调用GC.start后释放。当从Hash中删除键并且这些对象在某处泄漏时,这是预期的行为还是GC不释放内存?如何在Ruby中删除Hash中的键并在内存中取消分配它?例子:irb(main):001:0>`ps-orss=-p#{Process.pid}`.to_i=>4748irb(main):002:0>a={}=>{}irb(main):003:0>1000000.times{|i|a[i]="test#{i}"}=>1000000irb(main):004:0>`ps-orss=-p

  10. ruby - 我可以删除 Ruby 中的方法别名吗? - 2

    假设我有一段Ruby代码,我想在其中为一个方法设置别名(我不知道为什么;让我们假设我有一个很好的理由)。classStringalias_method:contains?,:include?end我可以在本节之后删除这个别名吗? 最佳答案 remove_method在大多数情况下应该有效。但是,如果您的alias_method覆盖了现有方法,您可能需要通过单独的alias_method调用来保存原始方法。#assuming:contains?isalreadyamethodalias_method:original_contains

随机推荐