50
50
51
51
## 解法
52
52
53
- 先求出两个链表的长度差 ` len1-len2 ` ,之后遍历链表,长的链表先走 ` len1-len2 ` 步 。
53
+ 使用两个指针 ` cur1 ` , ` cur2 ` 分别指向两个链表 ` headA ` , ` headB ` 。
54
54
55
- 接着两个链表同时走,当出现相同的节点时,说明两个链表在此节点相交,返回此节点,否则返回 ` null ` 。
55
+ 同时遍历链表,当 ` cur1 ` 到达链表 ` headA ` 的末尾时,重新定位到链表 ` headB ` 的头节点;当 ` cur2 ` 到达链表 ` headB ` 的末尾时,重新定位到链表 ` headA ` 的头节点。
56
+
57
+ 若两指针相遇,所指向的结点就是第一个公共节点。若没相遇,说明两链表无公共节点,此时两个指针都指向 ` null ` 。
56
58
57
59
<!-- tabs:start -->
58
60
67
69
68
70
class Solution :
69
71
def getIntersectionNode (self , headA : ListNode, headB : ListNode) -> ListNode:
70
- if headA is None or headB is None :
71
- return None
72
- len1 = len2 = 0
73
- p, q = headA, headB
74
- while p:
75
- p = p.next
76
- len1 += 1
77
- while q:
78
- q = q.next
79
- len2 += 1
80
- p, q = headA, headB
81
- if len1 > len2:
82
- p, q = q, p
83
- for _ in range (abs (len1 - len2)):
84
- q = q.next
85
- while p and q:
86
- if p == q:
87
- return p
88
- p = p.next
89
- q = q.next
90
-
72
+ cur1, cur2 = headA, headB
73
+ while cur1 != cur2:
74
+ cur1 = headB if cur1 is None else cur1.next
75
+ cur2 = headA if cur2 is None else cur2.next
76
+ return cur1
91
77
```
92
78
93
79
### ** Java**
@@ -106,38 +92,12 @@ class Solution:
106
92
*/
107
93
public class Solution {
108
94
public ListNode getIntersectionNode (ListNode headA , ListNode headB ) {
109
- if (headA == null || headB == null ) {
110
- return null ;
111
- }
112
- ListNode p = headA, q = headB;
113
- int len1 = len(p), len2 = len(q);
114
- if (len1 > len2) {
115
- ListNode t = headA;
116
- headA = headB;
117
- headB = t;
95
+ ListNode cur1 = headA, cur2 = headB;
96
+ while (cur1 != cur2) {
97
+ cur1 = cur1 == null ? headB : cur1. next;
98
+ cur2 = cur2 == null ? headA : cur2. next;
118
99
}
119
- p = headA;
120
- q = headB;
121
- for (int i = 0 ; i < Math . abs(len1 - len2); ++ i) {
122
- q = q. next;
123
- }
124
- while (p != null && q != null ) {
125
- if (p == q) {
126
- return p;
127
- }
128
- p = p. next;
129
- q = q. next;
130
- }
131
- return null ;
132
- }
133
-
134
- private int len (ListNode node ) {
135
- int len = 0 ;
136
- while (node != null ) {
137
- node = node. next;
138
- ++ len;
139
- }
140
- return len;
100
+ return cur1;
141
101
}
142
102
}
143
103
```
@@ -158,14 +118,14 @@ public class Solution {
158
118
* @param {ListNode} headB
159
119
* @return {ListNode}
160
120
*/
161
- var getIntersectionNode = function (headA , headB ) {
162
- let h1 = headA;
163
- let h2 = headB;
164
- while (h1 !== h2 ) {
165
- h1 = h1 === null ? headB : h1 . next ;
166
- h2 = h2 === null ? headA : h2 . next ;
167
- }
168
- return h2 ;
121
+ var getIntersectionNode = function (headA , headB ) {
122
+ let cur1 = headA;
123
+ let cur2 = headB;
124
+ while (cur1 != cur2 ) {
125
+ cur1 = cur1 ? cur1 . next : headB ;
126
+ cur2 = cur2 ? cur2 . next : headA ;
127
+ }
128
+ return cur1 ;
169
129
};
170
130
```
171
131
@@ -180,25 +140,48 @@ var getIntersectionNode = function (headA, headB) {
180
140
* ListNode(int x) : val(x), next(NULL) {}
181
141
* };
182
142
*/
183
-
184
143
class Solution {
185
144
public:
186
145
ListNode * getIntersectionNode(ListNode * headA, ListNode * headB) {
187
- ListNode* a = headA;
188
- ListNode* b = headB;
189
- while (a != b) {
190
- /* 这个循环的思路是,a先从listA往后走,如果到最后,就接着从listB走;b正好相反。
191
- 如果有交集的话,a和b会在分别进入listB和listA之后的循环中项目
192
- 如果没有交集的话,则a和b会同时遍历完listA和listB后,值同时为nullptr * /
193
- a = (a == nullptr) ? headB : a->next;
194
- b = (b == nullptr) ? headA : b->next;
146
+ ListNode* cur1 = headA;
147
+ ListNode* cur2 = headB;
148
+ while (cur1 != cur2) {
149
+ cur1 = cur1 ? cur1->next : headB;
150
+ cur2 = cur2 ? cur2->next : headA;
195
151
}
196
-
197
- return a;
152
+ return cur1;
198
153
}
199
154
};
200
155
```
201
156
157
+ ### **Go**
158
+
159
+ ```go
160
+ /**
161
+ * Definition for singly-linked list.
162
+ * type ListNode struct {
163
+ * Val int
164
+ * Next *ListNode
165
+ * }
166
+ */
167
+ func getIntersectionNode(headA, headB *ListNode) *ListNode {
168
+ cur1, cur2 := headA, headB
169
+ for cur1 != cur2 {
170
+ if cur1 == nil {
171
+ cur1 = headB
172
+ } else {
173
+ cur1 = cur1.Next
174
+ }
175
+ if cur2 == nil {
176
+ cur2 = headA
177
+ } else {
178
+ cur2 = cur2.Next
179
+ }
180
+ }
181
+ return cur1
182
+ }
183
+ ```
184
+
202
185
### ** ...**
203
186
204
187
```
0 commit comments