代码随想录算法训练营Day4 | 24.两两交换链表中的节点, 19.删除链表的倒数第N个节点, 160.链表相交, 142.环形链表II

Leetcode 24. Swap Nodes in Pairs

代码随想录算法训练营Day4 | 24.两两交换链表中的节点, 19.删除链表的倒数第N个节点, 160.链表相交, 142.环形链表II_第1张图片

首先遇到链表的题目,我们一般会使用一个虚拟头来更好的处理第一个 node,然后将 cur pointer 初始设在 dummy node。

解决这道题目需要三个步骤:

代码随想录算法训练营Day4 | 24.两两交换链表中的节点, 19.删除链表的倒数第N个节点, 160.链表相交, 142.环形链表II_第2张图片

操作之后,链表如下:

代码随想录算法训练营Day4 | 24.两两交换链表中的节点, 19.删除链表的倒数第N个节点, 160.链表相交, 142.环形链表II_第3张图片

代码随想录算法训练营Day4 | 24.两两交换链表中的节点, 19.删除链表的倒数第N个节点, 160.链表相交, 142.环形链表II_第4张图片这三个步骤之后 node 2 和 node 1 就换好了,之后需要将 cur pointer 移动两个 nodes 去准备下一轮交换。

python 代码如下:

代码随想录算法训练营Day4 | 24.两两交换链表中的节点, 19.删除链表的倒数第N个节点, 160.链表相交, 142.环形链表II_第5张图片

 c++ 代码如下:

代码随想录算法训练营Day4 | 24.两两交换链表中的节点, 19.删除链表的倒数第N个节点, 160.链表相交, 142.环形链表II_第6张图片


Leetcode 19. Remove Nth Node From End of List

代码随想录算法训练营Day4 | 24.两两交换链表中的节点, 19.删除链表的倒数第N个节点, 160.链表相交, 142.环形链表II_第7张图片

这道题目用到了一个新的方法:快慢指针。

step1: 首先移动 fast 指针 n + 1 步。为什么是 n+1 呢?因为只有这样同时移动的时候 slow 才能指向删除节点的上一个节点。

step2: 同时移动 slow 和 fast 指针,每次一步,知道 fast 指向 null。

step3: 移除 slow 指向的 node。

python 代码如下:

代码随想录算法训练营Day4 | 24.两两交换链表中的节点, 19.删除链表的倒数第N个节点, 160.链表相交, 142.环形链表II_第8张图片

c++ 代码如下:

代码随想录算法训练营Day4 | 24.两两交换链表中的节点, 19.删除链表的倒数第N个节点, 160.链表相交, 142.环形链表II_第9张图片


Leetcode 160. Intersection of Two Linked Lists

代码随想录算法训练营Day4 | 24.两两交换链表中的节点, 19.删除链表的倒数第N个节点, 160.链表相交, 142.环形链表II_第10张图片

这道题目有两个方法:

Method1: 从 headA 开始,把每一个 node 放进一个 hash set 里面,然后从 headB 开始寻找有没有一个 node 已经在 hash set 里面了,那个 node 就是相交的节点。

Method2: 使用两个 pointer (l1, l2),l1 的初始位置设在 headA,l2 的初始位置设在 headB。然后移动 l1 直到 l1 是 null 的时候,把 l1 设在 headB。同样的操作,移动 l2 直到 l2 是 null 的时候,把l2 设在 headA。直到 l1 == l2,两个 pointer 相交。

这里的代码是使用第二种方法来写的。

python 代码如下;

代码随想录算法训练营Day4 | 24.两两交换链表中的节点, 19.删除链表的倒数第N个节点, 160.链表相交, 142.环形链表II_第11张图片

 c++ 代码如下:

代码随想录算法训练营Day4 | 24.两两交换链表中的节点, 19.删除链表的倒数第N个节点, 160.链表相交, 142.环形链表II_第12张图片


Leetcode 142. Linked List Cycle II

代码随想录算法训练营Day4 | 24.两两交换链表中的节点, 19.删除链表的倒数第N个节点, 160.链表相交, 142.环形链表II_第13张图片代码随想录算法训练营Day4 | 24.两两交换链表中的节点, 19.删除链表的倒数第N个节点, 160.链表相交, 142.环形链表II_第14张图片判断是否有环,可以使用快慢指针法,分别定义 fast 和 slow 指针,从头结点出发,fast 指针每次移动两个节点,slow 指针每次移动一个节点,如果 fast 和 slow 指针在途中相遇,说明这个链表是有环的。

判断有环之后,找到这个环的入口可以通过另外两个 pointers。从头结点出发一个指针 pointer1,从相遇节点也出发一个指针 pointer2,这两个指针每次只走一个节点, 那么当这两个指针相遇的时候就是环形入口的节点。具体思路参考

python 代码如下:

代码随想录算法训练营Day4 | 24.两两交换链表中的节点, 19.删除链表的倒数第N个节点, 160.链表相交, 142.环形链表II_第15张图片

 c++ 代码如下:

代码随想录算法训练营Day4 | 24.两两交换链表中的节点, 19.删除链表的倒数第N个节点, 160.链表相交, 142.环形链表II_第16张图片

 Reference

链表总结篇

 

 

 

你可能感兴趣的:(代码随想录算法训练营Day4 | 24.两两交换链表中的节点, 19.删除链表的倒数第N个节点, 160.链表相交, 142.环形链表II)