当前位置:网站首页>LeetCode142. Circular linked list II [two pointers, two methods for judging links in the linked list and finding ring points]
LeetCode142. Circular linked list II [two pointers, two methods for judging links in the linked list and finding ring points]
2022-07-07 22:49:00 【Qingshan's green shirt】
LeetCode142. Circular list II
List of articles
1. subject

2. Ideas
Two steps :
1. Determine whether there is a ring —— Fast and slow pointer methodIt should be noted that : We will meet , Because after entering the ring, it is equivalent to fast The pointer moves forward one chase at a time slow The pointer
2. Look for the entrance of the ring
a. Start a pointer from the beginning node , From the meeting node Also start a pointer , These two pointers walk only one node at a time , So when these two pointers meet, it is The node of the ring entrance .
Here is the mathematical proof :n If it is greater than 1 The situation of , Namely fast The pointer turns in a circle n After the circle, I met slow The pointer . Actually sum n by 1 When The effect is the same , You can also find the circular entry node through this method , It's just ,index1 The pointer is in the ring Turn more (n-1) circle , Then meet again index2, The meeting point is still the entrance node of the ring .
b. Disconnect list , Combine the problem of linked list intersection to find the beginning
3. Code implementation
(1) Determine whether there is a ring
//1. Set the speed pointer to the header
ListNode* fast = head;
ListNode* slow = head;
//2.fast Take two steps at a time slow One step at a time
// It's not good to write like this ! If fast->next It's empty , Cannot access fast->next->next!
//while(fast->next != NULL && fast->next->next != NULL)
while(fast!=NULL && fast->next !=NULL)
{
fast = fast->next->next;
slow = slow->next;
if(fast == slow) break;// Equal to jump out
}
//3. The condition used to determine the jump is fast == slow still fast Empty finger
if(fast==NULL || fast->next == NULL)
return NULL;
matters needing attention
1. It's not good to write like this ! If fast->next It's empty , Cannot access fast->next->next!
while(fast->next != NULL && fast->next->next != NULL)
2. The cyclic condition cannot bewhile(fast != slow), In this case, the acyclic condition cannot be distinguished !
(2) Look for the entrance of the ring
a. Mathematical methods Set two more pointers
ListNode* p1 = fast;// Start a pointer from the encounter node
ListNode* p2 = head;// Start a pointer from the beginning node
while(p1 != p2)
{
p1 = p1->next;
p2 = p2->next;
}
return p1;// The encounter node is the linked list entry
b. Disconnect list , Join linked list intersection
//ListNode *x;x->next = fast;x->next = NULL That's not right !
ListNode* p = fast;
while(p->next != fast)
p = p->next;
p->next = NULL;
// Become two linked lists , One by head start A meeting point fast start
ListNode* m = head; ListNode* n = fast;
// Count the length of the two linked lists
int len1 = 0;int len2 = 0;
while(m!= NULL) {
m = m->next;len1 ++;}
while(n != NULL){
n = n->next;len2++;}
if(len1 > len2){
int n = len1 - len2;// Calculate the linked list difference
while(n--){
// The pointer of the long linked list goes backward first , Align with the pointer of the short linked list
head = head->next;
}
while( head != fast)// Step back synchronously , Until equal nodes are encountered .
{
head = head->next;
fast = fast->next;
}
return head;
}
else{
int n = len2 - len1;
while(n--){
fast = fast->next;
}
while( head != fast)
{
head = head->next;
fast = fast->next;
}
return head;
}
matters needing attention
ListNode *x;x->next = fast;x->next = NULL, Never write that ! The single linked list cannot access the node in front of it !
Complete code
Method 1 :
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
ListNode* fast = head;
ListNode* slow = head;
while(fast!=NULL && fast->next !=NULL)
{
fast = fast->next->next;// Two steps at a time
slow = slow->next; // One step at a time
if(fast == slow) break;
}
if(fast==NULL || fast->next == NULL)
return NULL;
ListNode* p1 = fast;// Start a pointer from the encounter node
ListNode* p2 = head;// Start a pointer from the beginning node
while(p1 != p2)
{
p1 = p1->next;
p2 = p2->next;
}
return p1;// The encounter node is the linked list entry
}
};
Method 2 :
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
ListNode* fast = head;
ListNode* slow = head;
while(fast!=NULL && fast->next !=NULL)
{
fast = fast->next->next;// Two steps at a time
slow = slow->next; // One step at a time
if(fast == slow) break;
}
if(fast==NULL || fast->next == NULL)
return NULL;
ListNode* p = fast;//ListNode *x;x->next = fast?
while(p->next != fast)
p = p->next;
p->next = NULL;
// Become two linked lists , One by head start A meeting point fast start
ListNode* m = head; ListNode* n = fast;
while(m!= NULL) {
m = m->next;len1 ++;}
while(n != NULL){
n = n->next;len2++;}
if(len1 > len2){
int n = len1 - len2;
while(n--){
head = head->next;
}
while( head != fast)
{
head = head->next;
fast = fast->next;
}
return head;
}
else{
int n = len2 - len1;
while(n--){
fast = fast->next;
}
while( head != fast)
{
head = head->next;
fast = fast->next;
}
return head;
}
}
};
边栏推荐
- php 记录完整对接腾讯云直播以及im直播群聊 所遇到的坑
- IP网络主动测评系统——X-Vision
- Debezium系列之:引入对 LATERAL 运算符的支持
- Variables and constants
- 戴森官方直营店免费造型服务现已开放预约 先锋科技诠释护发造型理念,助力消费者解锁多元闪耀造型
- Nx10.0 installation tutorial
- Revit secondary development - link file collision detection
- JS number is insufficient, and 0 is added
- Revit secondary development - shielding warning prompt window
- 行测-图形推理-8-图群类
猜你喜欢

How to choose the appropriate automated testing tools?

详解全志V853上的ARM A7和RISC-V E907之间的通信方式
![[azure microservice service fabric] start the performance monitor in the SF node and set the method of capturing the process](/img/80/11c2b539c217ecd6ba55668d3e71e9.png)
[azure microservice service fabric] start the performance monitor in the SF node and set the method of capturing the process

客户案例|华律网,通过观测云大幅缩短故障定位时间

行测-图形推理-3-对称图形类

Cannot find module 'xxx' or its corresponding type declaration

Digital transformation: five steps to promote enterprise progress

XMIND mind mapping software sharing

行测-图形推理-6-相似图形类

vite Unrestricted file system access to
随机推荐
Debezium系列之:mysql墓碑事件
Ni9185 and ni9234 hardware settings in Ni Max
The free styling service of Dyson's official direct store is now open for appointment. Pioneer Technology interprets the styling concept of hair care and helps consumers unlock diversified and shiny s
行测-图形推理-9-线条问题类
Apple further entered the financial sector through the 'virtual card' security function in IOS 16
Kaggle-Titanic
Debezium series: set role statement supporting mysql8
Firefox browser installation impression notes clipping
Redis cluster installation
Redis集群安装
Pyqt GUI interface and logic separation
行测-图形推理-7-相异图形类
UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xf9 in position 56: illegal multibyte sequence
Application practice | the efficiency of the data warehouse system has been comprehensively improved! Data warehouse construction based on Apache Doris in Tongcheng digital Department
微服务架构开源框架详情介绍
OpenGL homework - Hello, triangle
Overseas agent recommendation
Leetcode1984. Minimum difference in student scores
Debezium系列之:源码阅读之SnapshotReader
JS number is insufficient, and 0 is added
It should be noted that : We will meet , Because after entering the ring, it is equivalent to fast The pointer moves forward one chase at a time slow The pointer 

