-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlinked_list_intersection.cpp
More file actions
96 lines (91 loc) · 3.21 KB
/
Copy pathlinked_list_intersection.cpp
File metadata and controls
96 lines (91 loc) · 3.21 KB
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
// https://leetcode.com/problems/intersection-of-two-linked-lists/
/*
Write a program to find the node at which the intersection of two singly
linked lists begins.
Example 1:
Input: intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5],
skipA = 2, skipB = 3
Output: Reference of the node with value = 8
Input Explanation: The intersected node's value is 8 (note that this must
not be 0 if the two lists intersect). From the head of A, it reads as
[4,1,8,4,5]. From the head of B, it reads as [5,0,1,8,4,5]. There are 2
nodes before the intersected node in A; There are 3 nodes before the
intersected node in B.
Example 2:
Input: intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4],
skipA = 3, skipB = 1
Output: Reference of the node with value = 2
Input Explanation: The intersected node's value is 2 (note that this must
not be 0 if the two lists intersect). From the head of A, it reads as
[0,9,1,2,4]. From the head of B, it reads as [3,2,4]. There are 3 nodes
before the intersected node in A; There are 1 node before the intersected
node in B.
Example 3:
Input: intersectVal = 0, listA = [2,6,4], listB = [1,5],
skipA = 3, skipB = 2
Output: null
Input Explanation: From the head of A, it reads as [2,6,4]. From the head
of B, it reads as [1,5]. Since the two lists do not intersect, intersectVal
must be 0, while skipA and skipB can be arbitrary values.
Explanation: The two lists do not intersect, so return null.
Notes:
If the two linked lists have no intersection at all, return null.
The linked lists must retain their original structure after the function returns.
You may assume there are no cycles anywhere in the entire linked structure.
Your code should preferably run in O(n) time and use only O(1) memory.
*/
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if(!headA || !headB){
return NULL;
}
if(headA == headB){return headA;}
// get the smaller of two lists
int na = 0;
ListNode *node = new ListNode; node = headA;
while(node){
node = node->next;
na++;
}
int nb = 0; node = headB;
while(node){
node = node->next;
nb++;
}
// now, move the pointer of the larger list so that
// the smaller and larger list become the same length
// when we have two lists of same length, we can simultaneously
// iterate over them until we find a node such that both nodes
// are same
// cout << na << nb << endl;
if(na < nb){
while(nb-na){
headB = headB->next;
nb--;
}
}else{
while(na-nb){
headA = headA->next;
na--;
}
}
while(headA){
// cout << headA->val << headB->val << endl;
if(headA == headB){
return headA;
}
headA = headA->next;
headB = headB->next;
}
return NULL;
}
};