-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathListCycle.cpp
64 lines (54 loc) · 1.65 KB
/
ListCycle.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/*
List Cycle
Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Try solving it using constant additional space. Example :
Input :
______
| |
\/ |
1 -> 2 -> 3 -> 4
Return the node corresponding to node 3.
*/
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
ListNode *Solution::detectCycle(ListNode *A)
{
// Do not write main() function.
// Do not read input, instead use the arguments to the function.
// Do not print the output, instead return values as specified
// Still have a doubt. Checkout www.interviewbit.com/pages/sample_codes/ for more details
ListNode *p1 = A, *p2 = A, *head = A;
int flag = 0;
int length_loop = 0;
while (p1 != NULL && p2 != NULL) // loop till slow pounter or fast pointer is not null
{
p1 = p1->next;
if (p2->next == NULL)
{ // if next of fast pointer is null, no loop
return NULL;
}
else
{
p2 = p2->next->next; // increment fast pointer by 2
}
if (p1 == p2)
{ // Fast pointer equals slow pointer loop found
//length_loop+=1;
break;
}
}
if (p1 == NULL || p2 == NULL) // is slow or fast pointer reaches NULL no loop
return NULL;
while (head != p1)
{ // Current head would be incremented till length of cycle, i.e till it reaches to slow pointer
head = head->next;
p1 = p1->next;
}
return head;
//return NULL;
}