58
58
59
59
## 解法
60
60
61
- 使用两个指针 ` cur1 ` , ` cur2 ` 分别指向两个链表 ` headA ` , ` headB ` 。
61
+ ** 方法一:双指针 **
62
62
63
- 同时遍历链表,当 ` cur1 ` 到达链表 ` headA ` 的末尾时,重新定位到链表 ` headB ` 的头节点;当 ` cur2 ` 到达链表 ` headB ` 的末尾时,重新定位到链表 ` headA ` 的头节点。
63
+ 我们可以用两个指针 $a$ 和 $b$ 分别指向两个链表的头节点,然后同时分别向后遍历,当 $a$ 到达链表 $A$ 的末尾时,令 $a$ 指向链表 $B$ 的头节点;当 $b$ 到达链表 $B$ 的末尾时,令 $b$ 指向链表 $A$ 的头节点。这样,当它们相遇时,所指向的节点就是第一个公共节点 。
64
64
65
- 若两指针相遇,所指向的结点就是第一个公共节点。若没相遇,说明两链表无公共节点,此时两个指针都指向 ` null ` 。
65
+ 时间复杂度 $O(m + n)$,空间复杂度 $O(1)$。其中 $m$ 和 $n$ 分别为两个链表的长度 。
66
66
67
67
<!-- tabs:start -->
68
68
78
78
79
79
class Solution :
80
80
def getIntersectionNode (self , headA : ListNode, headB : ListNode) -> ListNode:
81
- cur1, cur2 = headA, headB
82
- while cur1 != cur2 :
83
- cur1 = headB if cur1 is None else cur1.next
84
- cur2 = headA if cur2 is None else cur2.next
85
- return cur1
81
+ a, b = headA, headB
82
+ while a != b :
83
+ a = a.next if a else headB
84
+ b = b.next if b else headA
85
+ return a
86
86
```
87
87
88
88
### ** Java**
@@ -99,45 +99,18 @@ class Solution:
99
99
* }
100
100
* }
101
101
*/
102
- public class Solution {
103
- public ListNode getIntersectionNode (ListNode headA , ListNode headB ) {
104
- ListNode cur1 = headA, cur2 = headB;
105
- while (cur1 != cur2 ) {
106
- cur1 = cur1 == null ? headB : cur1 . next;
107
- cur2 = cur2 == null ? headA : cur2 . next;
102
+ class Solution {
103
+ ListNode getIntersectionNode (ListNode headA , ListNode headB ) {
104
+ ListNode a = headA, b = headB;
105
+ while (a != b ) {
106
+ a = a == null ? headB : a . next;
107
+ b = b == null ? headA : b . next;
108
108
}
109
- return cur1 ;
109
+ return a ;
110
110
}
111
111
}
112
112
```
113
113
114
- ### ** JavaScript**
115
-
116
- ``` js
117
- /**
118
- * Definition for singly-linked list.
119
- * function ListNode(val) {
120
- * this.val = val;
121
- * this.next = null;
122
- * }
123
- */
124
-
125
- /**
126
- * @param {ListNode} headA
127
- * @param {ListNode} headB
128
- * @return {ListNode}
129
- */
130
- var getIntersectionNode = function (headA , headB ) {
131
- let cur1 = headA;
132
- let cur2 = headB;
133
- while (cur1 != cur2) {
134
- cur1 = cur1 ? cur1 .next : headB;
135
- cur2 = cur2 ? cur2 .next : headA;
136
- }
137
- return cur1;
138
- };
139
- ```
140
-
141
114
### ** C++**
142
115
143
116
``` cpp
@@ -151,14 +124,13 @@ var getIntersectionNode = function (headA, headB) {
151
124
*/
152
125
class Solution {
153
126
public:
154
- ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {
155
- ListNode* cur1 = headA;
156
- ListNode* cur2 = headB;
157
- while (cur1 != cur2) {
158
- cur1 = cur1 ? cur1->next : headB;
159
- cur2 = cur2 ? cur2->next : headA;
127
+ ListNode * getIntersectionNode(ListNode * headA, ListNode * headB) {
128
+ ListNode * a = headA, * b = headB;
129
+ while (a != b) {
130
+ a = a ? a->next : headB;
131
+ b = b ? b->next : headA;
160
132
}
161
- return cur1 ;
133
+ return a ;
162
134
}
163
135
};
164
136
```
@@ -174,20 +146,76 @@ public:
174
146
* }
175
147
*/
176
148
func getIntersectionNode(headA, headB *ListNode) *ListNode {
177
- cur1, cur2 := headA, headB
178
- for cur1 != cur2 {
179
- if cur1 == nil {
180
- cur1 = headB
181
- } else {
182
- cur1 = cur1.Next
183
- }
184
- if cur2 == nil {
185
- cur2 = headA
186
- } else {
187
- cur2 = cur2.Next
188
- }
149
+ a, b := headA, headB
150
+ for a != b {
151
+ if a != nil {
152
+ a = a.Next
153
+ } else {
154
+ a = headB
155
+ }
156
+ if b != nil {
157
+ b = b.Next
158
+ } else {
159
+ b = headA
160
+ }
161
+ }
162
+ return a
163
+ }
164
+ ```
165
+
166
+ ### ** JavaScript**
167
+
168
+ ``` js
169
+ /**
170
+ * Definition for singly-linked list.
171
+ * function ListNode(val) {
172
+ * this.val = val;
173
+ * this.next = null;
174
+ * }
175
+ */
176
+
177
+ /**
178
+ * @param {ListNode} headA
179
+ * @param {ListNode} headB
180
+ * @return {ListNode}
181
+ */
182
+ var getIntersectionNode = function (headA , headB ) {
183
+ let a = headA;
184
+ let b = headB;
185
+ while (a != b) {
186
+ a = a ? a .next : headB;
187
+ b = b ? b .next : headA;
188
+ }
189
+ return a;
190
+ };
191
+ ```
192
+
193
+ ### ** TypeScript**
194
+
195
+ ``` ts
196
+ /**
197
+ * Definition for singly-linked list.
198
+ * class ListNode {
199
+ * val: number
200
+ * next: ListNode | null
201
+ * constructor(val?: number, next?: ListNode | null) {
202
+ * this.val = (val===undefined ? 0 : val)
203
+ * this.next = (next===undefined ? null : next)
204
+ * }
205
+ * }
206
+ */
207
+
208
+ function getIntersectionNode(
209
+ headA : ListNode | null ,
210
+ headB : ListNode | null ,
211
+ ): ListNode | null {
212
+ let a = headA ;
213
+ let b = headB ;
214
+ while (a != b ) {
215
+ a = a ? a .next : headB ;
216
+ b = b ? b .next : headA ;
189
217
}
190
- return cur1
218
+ return a ;
191
219
}
192
220
```
193
221
@@ -204,13 +232,12 @@ func getIntersectionNode(headA, headB *ListNode) *ListNode {
204
232
*/
205
233
public class Solution {
206
234
public ListNode GetIntersectionNode (ListNode headA , ListNode headB ) {
207
- ListNode cur1 = headA , cur2 = headB ;
208
- while (cur1 != cur2 )
209
- {
210
- cur1 = cur1 == null ? headB : cur1 .next ;
211
- cur2 = cur2 == null ? headA : cur2 .next ;
235
+ ListNode a = headA , b = headB ;
236
+ while (a != b ) {
237
+ a = a == null ? headB : a .next ;
238
+ b = b == null ? headA : b .next ;
212
239
}
213
- return cur1 ;
240
+ return a ;
214
241
}
215
242
}
216
243
```
0 commit comments