LeetCode 142——环形链表 II
1. 题目
2. 解答
2.1 方法 1
定义快慢两个指针,慢指针每次前进一步,快指针每次前进两步,若链表有环,则快慢指针一定会相遇。
当快慢指针相遇时,我们让慢指针指向头节点,快指针不变,然后每次快慢指针都前进一步,当两个指针再次相遇时,两个指针所指向的节点就是入环节点。
将链表的环向后展开,如上图所示,假设第一次相遇时慢指针走过了 a 个节点,即图中 s 节点,可知此时快指针指向同一个节点,即图中的 f 节点。
然后,假设慢指针从链表头到入环节点共有 b 个节点,快指针从快慢指针相遇节点到入环节点共有 c 个节点。那么可知第一次相遇时,快指针走过了 a+c+a-b 个节点,这应该是慢指针走过节点数的两倍,也即 a+c+a-b = 2a,所以有 b=c。
/**
* 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) {
ListNode *slow = head;
ListNode *fast = head;
while (fast && fast->next)
{
slow = slow->next;
fast = fast->next->next;
if (slow == fast) break;
}
if (fast && fast->next)
{
slow = head;
while (slow != fast)
{
slow = slow->next;
fast = fast->next;
}
return slow;
}
return NULL;
}
};
2.2 方法 2
用 unordered_map 充当散列表的功能,每次将链表的节点指针作为键值存入 map,如果检测到当前节点指针已经存在于 map 中则说明当前节点指针即为链表入环的第一个节点。
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
unordered_map<ListNode *, char> nodemap;
ListNode *temp = head;
while (temp)
{
// 当前节点已存在于 map 中,即为链表入环的第一个节点
if (nodemap.count(temp) == 1) return temp;
nodemap[temp] = '0';
temp = temp->next;
}
return NULL;
}
};
获取更多精彩,请关注「seniusen」!
LeetCode 142——环形链表 II的更多相关文章
- LeetCode 142. 环形链表 II(Linked List Cycle II)
142. 环形链表 II 142. Linked List Cycle II 题目描述 给定一个链表,返回链表开始入环的第一个节点.如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整 ...
- Java实现 LeetCode 142 环形链表 II(二)
142. 环形链表 II 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始 ...
- Leetcode 142.环形链表II
环形链表II 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 说明:不允许修改给定的链表. 进阶:你是否可以不用额外空间解决此题? 链表头是X,环的第一个节点是Y,sl ...
- LeetCode | 142. 环形链表 II
原题(Medium): 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始) ...
- LeetCode 142——环形链表II(JAVA)
给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 - ...
- LeetCode 142. 环形链表 II(Linker List Cycle II)
题目描述 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 说明:不允许修改给定的链表. 进阶: 你是否可以不用额外空间解决此题? 解题思路 分为三步: 首先判断是否存在 ...
- leetcode 142. 环形链表 II(c++)
给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 - ...
- 【LeetCode】142. 环形链表 II
142. 环形链表 II 知识点:链表:set:快慢指针 题目描述 给定一个链表,判断链表中是否有环. 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表 ...
- Leetcode.142-Linked-list-cycle-ii(环形链表II)
环形链表II 思路 https://www.cnblogs.com/springfor/p/3862125.html https://blog.csdn.net/u010292561/article/ ...
随机推荐
- 汇编中PSP是什么?为什么一般cs比ds大10h
一般来说,PSP是256个字节,当程度生成了可执行文件以后,在执行的时候,先将程序调入内存, 这个时候DS中存入程序在内存中的段地址,紧接着是程序的一些说明,比如说程序占用多大空间等 等,这就是PSP ...
- 5. CSS是什么
CSS概念 CSS,层叠样式表,也叫做风格样式表.通过CSS我们可以为页面添加一个美丽的外观,获得更加良好的用户体验.不过值得我们注意的是和HTML一样,CSS也不是编程语言,它只是提供一种配置文件, ...
- Order Helper
using System; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Query; using Microsoft.Crm.Sdk.Messag ...
- eval函数的作用
eval函数的作用是去掉字符串最外侧的引号,并按照Python的语法执行去掉引号后的字符内容. [实例1] x=eval("12+36")print(x) #结果为48此例中,去 ...
- GDB 单步调试汇编
本文同时发表在 https://github.com/zhangyachen/zhangyachen.github.io/issues/134 之前在看汇编的时候一直是肉眼看GCC -S的结果,缺点是 ...
- P2P通讯
转载: http://www.cnblogs.com/pannengzhi/p/4800526.html http://blog.csdn.net/lee353086/article/details/ ...
- 高斯消元c++(非常暴力)
暴力方法(已更新): #include<iostream> using namespace std; const int maxn = 1000; int n; double a[maxn ...
- Java基础—IO小结(二)缓冲流与其它流的使用
一.缓冲流的使用 每个字节流都有对应的缓冲流: BufferedInputStream / BufferedOutputStream 构造器: 方法摘要与对应节点流类似 使用缓冲流实现文件复制:实际中 ...
- nmap教程(上)
一.nmap的主要功能 1.端口扫描 2.主机探测:查找目标网络的在线主机 3.服务/版本检测:发现开放端口后,进一步检测目标主机的检测服务协议.应用程序名称.版本号等信息 4.操作系统检测 5.网络 ...
- Chrome模拟平板调试
1. 按F12,打开开发者工具,右上角,点击红圈中的标志.然后在弹出的面板中点击'Emulation'. 2. 会看到左侧的四个选项卡 Device 设备.Screen 屏幕.User Agent ...