Skip to content

Commit 97ae084

Browse files
committed
feat: add solutions to lcof problems: No.52,53.1
1 parent f53861b commit 97ae084

File tree

16 files changed

+284
-401
lines changed

16 files changed

+284
-401
lines changed

lcof/面试题52. 两个链表的第一个公共节点/README.md

+95-68
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,11 @@
5858

5959
## 解法
6060

61-
使用两个指针 `cur1`, `cur2` 分别指向两个链表 `headA`, `headB`
61+
**方法一:双指针**
6262

63-
同时遍历链表,当 `cur1` 到达链表 `headA` 的末尾时,重新定位到链表 `headB` 的头节点;当 `cur2` 到达链表 `headB` 的末尾时,重新定位到链表 `headA` 的头节点。
63+
我们可以用两个指针 $a$ 和 $b$ 分别指向两个链表的头节点,然后同时分别向后遍历,当 $a$ 到达链表 $A$ 的末尾时,令 $a$ 指向链表 $B$ 的头节点;当 $b$ 到达链表 $B$ 的末尾时,令 $b$ 指向链表 $A$ 的头节点。这样,当它们相遇时,所指向的节点就是第一个公共节点
6464

65-
若两指针相遇,所指向的结点就是第一个公共节点。若没相遇,说明两链表无公共节点,此时两个指针都指向 `null`
65+
时间复杂度 $O(m + n)$,空间复杂度 $O(1)$。其中 $m$ 和 $n$ 分别为两个链表的长度
6666

6767
<!-- tabs:start -->
6868

@@ -78,11 +78,11 @@
7878

7979
class Solution:
8080
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
8686
```
8787

8888
### **Java**
@@ -99,45 +99,18 @@ class Solution:
9999
* }
100100
* }
101101
*/
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;
108108
}
109-
return cur1;
109+
return a;
110110
}
111111
}
112112
```
113113

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-
141114
### **C++**
142115

143116
```cpp
@@ -151,14 +124,13 @@ var getIntersectionNode = function (headA, headB) {
151124
*/
152125
class Solution {
153126
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;
160132
}
161-
return cur1;
133+
return a;
162134
}
163135
};
164136
```
@@ -174,20 +146,76 @@ public:
174146
* }
175147
*/
176148
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;
189217
}
190-
return cur1
218+
return a;
191219
}
192220
```
193221

@@ -204,13 +232,12 @@ func getIntersectionNode(headA, headB *ListNode) *ListNode {
204232
*/
205233
public class Solution {
206234
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;
212239
}
213-
return cur1;
240+
return a;
214241
}
215242
}
216243
```

lcof/面试题52. 两个链表的第一个公共节点/Solution.cpp

+6-7
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,12 @@
88
*/
99
class Solution {
1010
public:
11-
ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {
12-
ListNode* cur1 = headA;
13-
ListNode* cur2 = headB;
14-
while (cur1 != cur2) {
15-
cur1 = cur1 ? cur1->next : headB;
16-
cur2 = cur2 ? cur2->next : headA;
11+
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
12+
ListNode *a = headA, *b = headB;
13+
while (a != b) {
14+
a = a ? a->next : headB;
15+
b = b ? b->next : headA;
1716
}
18-
return cur1;
17+
return a;
1918
}
2019
};

lcof/面试题52. 两个链表的第一个公共节点/Solution.cs

+5-6
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,11 @@
88
*/
99
public class Solution {
1010
public ListNode GetIntersectionNode(ListNode headA, ListNode headB) {
11-
ListNode cur1 = headA, cur2 = headB;
12-
while (cur1 != cur2)
13-
{
14-
cur1 = cur1 == null ? headB : cur1.next;
15-
cur2 = cur2 == null ? headA : cur2.next;
11+
ListNode a = headA, b = headB;
12+
while (a != b) {
13+
a = a == null ? headB : a.next;
14+
b = b == null ? headA : b.next;
1615
}
17-
return cur1;
16+
return a;
1817
}
1918
}

lcof/面试题52. 两个链表的第一个公共节点/Solution.go

+15-15
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,19 @@
55
* Next *ListNode
66
* }
77
*/
8-
func getIntersectionNode(headA, headB *ListNode) *ListNode {
9-
cur1, cur2 := headA, headB
10-
for cur1 != cur2 {
11-
if cur1 == nil {
12-
cur1 = headB
13-
} else {
14-
cur1 = cur1.Next
15-
}
16-
if cur2 == nil {
17-
cur2 = headA
18-
} else {
19-
cur2 = cur2.Next
20-
}
21-
}
22-
return cur1
8+
func getIntersectionNode(headA, headB *ListNode) *ListNode {
9+
a, b := headA, headB
10+
for a != b {
11+
if a != nil {
12+
a = a.Next
13+
} else {
14+
a = headB
15+
}
16+
if b != nil {
17+
b = b.Next
18+
} else {
19+
b = headA
20+
}
21+
}
22+
return a
2323
}

lcof/面试题52. 两个链表的第一个公共节点/Solution.java

+7-7
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,13 @@
99
* }
1010
* }
1111
*/
12-
public class Solution {
13-
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
14-
ListNode cur1 = headA, cur2 = headB;
15-
while (cur1 != cur2) {
16-
cur1 = cur1 == null ? headB : cur1.next;
17-
cur2 = cur2 == null ? headA : cur2.next;
12+
class Solution {
13+
ListNode getIntersectionNode(ListNode headA, ListNode headB) {
14+
ListNode a = headA, b = headB;
15+
while (a != b) {
16+
a = a == null ? headB : a.next;
17+
b = b == null ? headA : b.next;
1818
}
19-
return cur1;
19+
return a;
2020
}
2121
}

lcof/面试题52. 两个链表的第一个公共节点/Solution.js

+6-6
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@
1212
* @return {ListNode}
1313
*/
1414
var getIntersectionNode = function (headA, headB) {
15-
let cur1 = headA;
16-
let cur2 = headB;
17-
while (cur1 != cur2) {
18-
cur1 = cur1 ? cur1.next : headB;
19-
cur2 = cur2 ? cur2.next : headA;
15+
let a = headA;
16+
let b = headB;
17+
while (a != b) {
18+
a = a ? a.next : headB;
19+
b = b ? b.next : headA;
2020
}
21-
return cur1;
21+
return a;
2222
};

lcof/面试题52. 两个链表的第一个公共节点/Solution.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77

88
class Solution:
99
def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
10-
cur1, cur2 = headA, headB
11-
while cur1 != cur2:
12-
cur1 = headB if cur1 is None else cur1.next
13-
cur2 = headA if cur2 is None else cur2.next
14-
return cur1
10+
a, b = headA, headB
11+
while a != b:
12+
a = a.next if a else headB
13+
b = b.next if b else headA
14+
return a
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/**
2+
* Definition for singly-linked list.
3+
* class ListNode {
4+
* val: number
5+
* next: ListNode | null
6+
* constructor(val?: number, next?: ListNode | null) {
7+
* this.val = (val===undefined ? 0 : val)
8+
* this.next = (next===undefined ? null : next)
9+
* }
10+
* }
11+
*/
12+
13+
function getIntersectionNode(
14+
headA: ListNode | null,
15+
headB: ListNode | null,
16+
): ListNode | null {
17+
let a = headA;
18+
let b = headB;
19+
while (a != b) {
20+
a = a ? a.next : headB;
21+
b = b ? b.next : headA;
22+
}
23+
return a;
24+
}

0 commit comments

Comments
 (0)