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

24.两两交换链表中的节点
题目链接:https://leetcode.cn/problems/swap-nodes-in-pairs/
思路:初始时,cur指向虚拟头结点,然后进行如下三步
代码随想录算法训练营第四天|24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II_第1张图片
代码随想录算法训练营第四天|24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II_第2张图片
然后将cur指向第三个节点

小结:

  1. 两两交换的前提是节点数是偶数,所以要在循环条件中加以约束
  2. 做题中犯了下面这样的错误:代码随想录算法训练营第四天|24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II_第3张图片注意在第一步中cur的指向已经发生了变化,所以第三步中1所在的节点指针应该是temp->next->next->next代码随想录算法训练营第四天|24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II_第4张图片
    19.删除链表的倒数第N个节点
    题目链接:https://leetcode.cn/problems/remove-nth-node-from-end-of-list/

思路

  1. 首先想到的是变成删除正数第size-N+1个节点。(注意链表下标也是从0开始)
    代码随想录算法训练营第四天|24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II_第5张图片
    这里犯了一个错,index写成index=size-n+1;

  2. 看了卡哥的题解,使用快慢指针
    代码随想录算法训练营第四天|24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II_第6张图片
    代码随想录算法训练营第四天|24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II_第7张图片
    代码随想录算法训练营第四天|24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II_第8张图片
    小结:双指针法在前面的删除数组中的元素也用到过。

面试题 02.07. 链表相交
题目链接:https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/
思路:求出两个链表的长度,并求出两个链表长度的差值,然后让curA移动到,和curB 末尾对齐的位置(A是长度较长的链表)
代码随想录算法训练营第四天|24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II_第9张图片
比较curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA == curB,则找到交点。
代码随想录算法训练营第四天|24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II_第10张图片
卡壳点:找到最长链表,并赋值长的长度。

142.环形链表II
题目链接:https://leetcode.cn/problems/linked-list-cycle-ii/
思路:定义两个指针,一个指针每次移动两步,一个指针每次移动一步
卡壳点:如何找到环的入口
代码随想录算法训练营第四天|24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II_第11张图片
相遇时: slow指针走过的节点数为: x + y, fast指针走过的节点数:x + y + n (y + z),n为fast指针在环内走了n圈才遇到slow指针, (y+z)为 一圈内节点的个数A。从头结点出发一个指针,从相遇节点 也出发一个指针,这两个指针每次只走一个节点, 那么当这两个指针相遇的时候就是 环形入口的节点。
代码随想录算法训练营第四天|24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II_第12张图片

你可能感兴趣的:(链表,算法)