11
11
12
12
<!-- 这里可写通用的实现逻辑 -->
13
13
14
- 先求两链表的长度差 ` differ ` ,接着较长的链表先走 ` differ ` 步,之后两链表同时走,若相遇,则说明相交。
14
+ 使用两个指针 ` cur1 ` , ` cur2 ` 分别指向两个链表 ` headA ` , ` headB ` 。
15
+
16
+ 同时遍历链表,当 ` cur1 ` 到达链表 ` headA ` 的末尾时,重新定位到链表 ` headB ` 的头节点;当 ` cur2 ` 到达链表 ` headB ` 的末尾时,重新定位到链表 ` headA ` 的头节点。
17
+
18
+ 若两指针相遇,所指向的结点就是第一个公共节点。若没相遇,说明两链表无公共节点,此时两个指针都指向 ` null ` 。
15
19
16
20
<!-- tabs:start -->
17
21
28
32
29
33
class Solution :
30
34
def getIntersectionNode (self , headA : ListNode, headB : ListNode) -> ListNode:
31
- len1, len2 = self ._length(headA), self ._length(headB)
32
- if len1 < len2:
33
- headA, headB = headB, headA
34
- differ = abs (len1 - len2)
35
- for _ in range (differ):
36
- headA = headA.next
37
- while headA:
38
- if headA == headB:
39
- return headA
40
- headA = headA.next
41
- headB = headB.next
42
- return None
43
-
44
- def _length (self , node : ListNode) -> int :
45
- n = 0
46
- while node:
47
- node = node.next
48
- n += 1
49
- return n
35
+ cur1, cur2 = headA, headB
36
+ while cur1 != cur2:
37
+ cur1 = headB if cur1 is None else cur1.next
38
+ cur2 = headA if cur2 is None else cur2.next
39
+ return cur1
50
40
```
51
41
52
42
### ** Java**
@@ -67,34 +57,93 @@ class Solution:
67
57
*/
68
58
public class Solution {
69
59
public ListNode getIntersectionNode (ListNode headA , ListNode headB ) {
70
- int len1 = len(headA), len2 = len(headB);
71
- int differ = Math . abs(len1 - len2);
72
- if (len1 < len2) {
73
- ListNode t = headA;
74
- headA = headB;
75
- headB = t;
60
+ ListNode cur1 = headA, cur2 = headB;
61
+ while (cur1 != cur2) {
62
+ cur1 = cur1 == null ? headB : cur1. next;
63
+ cur2 = cur2 == null ? headA : cur2. next;
76
64
}
77
- while (differ-- > 0 ) {
78
- headA = headA. next;
79
- }
80
- while (headA != null ) {
81
- if (headA == headB) {
82
- return headA;
83
- }
84
- headA = headA. next;
85
- headB = headB. next;
65
+ return cur1;
66
+ }
67
+ }
68
+ ```
69
+
70
+ ### ** C++**
71
+
72
+ ``` cpp
73
+ /* *
74
+ * Definition for singly-linked list.
75
+ * struct ListNode {
76
+ * int val;
77
+ * ListNode *next;
78
+ * ListNode(int x) : val(x), next(NULL) {}
79
+ * };
80
+ */
81
+ class Solution {
82
+ public:
83
+ ListNode * getIntersectionNode(ListNode * headA, ListNode * headB) {
84
+ ListNode* cur1 = headA;
85
+ ListNode* cur2 = headB;
86
+ while (cur1 != cur2) {
87
+ cur1 = cur1 ? cur1->next : headB;
88
+ cur2 = cur2 ? cur2->next : headA;
86
89
}
87
- return null ;
90
+ return cur1 ;
88
91
}
92
+ };
93
+ ```
94
+
95
+ ### **JavaScript**
89
96
90
- private int len (ListNode node ) {
91
- int n = 0 ;
92
- while (node != null ) {
93
- node = node. next;
94
- ++ n;
97
+ ```js
98
+ /**
99
+ * Definition for singly-linked list.
100
+ * function ListNode(val) {
101
+ * this.val = val;
102
+ * this.next = null;
103
+ * }
104
+ */
105
+
106
+ /**
107
+ * @param {ListNode} headA
108
+ * @param {ListNode} headB
109
+ * @return {ListNode}
110
+ */
111
+ var getIntersectionNode = function(headA, headB) {
112
+ let cur1 = headA;
113
+ let cur2 = headB;
114
+ while (cur1 != cur2) {
115
+ cur1 = cur1 ? cur1.next : headB;
116
+ cur2 = cur2 ? cur2.next : headA;
117
+ }
118
+ return cur1;
119
+ };
120
+ ```
121
+
122
+ ### ** Go**
123
+
124
+ ``` go
125
+ /* *
126
+ * Definition for singly-linked list.
127
+ * type ListNode struct {
128
+ * Val int
129
+ * Next *ListNode
130
+ * }
131
+ */
132
+ func getIntersectionNode (headA , headB *ListNode ) *ListNode {
133
+ cur1 , cur2 := headA, headB
134
+ for cur1 != cur2 {
135
+ if cur1 == nil {
136
+ cur1 = headB
137
+ } else {
138
+ cur1 = cur1.Next
139
+ }
140
+ if cur2 == nil {
141
+ cur2 = headA
142
+ } else {
143
+ cur2 = cur2.Next
95
144
}
96
- return n;
97
145
}
146
+ return cur1
98
147
}
99
148
```
100
149
0 commit comments