查找两个单链表的交点开始的节点。
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
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
Example 3:
Input: intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2 Output: null
Case 1 (Have Intersection & Same Len):
a
A: a1 → a2 → a3
↘
c1 → c2 → c3 → null
↗
B: b1 → b2 → b3
b
a
A: a1 → a2 → a3
↘
c1 → c2 → c3 → null
↗
B: b1 → b2 → b3
b
a
A: a1 → a2 → a3
↘
c1 → c2 → c3 → null
↗
B: b1 → b2 → b3
b
A: a1 → a2 → a3
↘ a
c1 → c2 → c3 → null
↗ b
B: b1 → b2 → b3
Since a == b
is true, end loop while(a != b)
, return the intersection node a = c1
.
Case 2 (Have Intersection & Different Len):
a
A: a1 → a2
↘
c1 → c2 → c3 → null
↗
B: b1 → b2 → b3
b
a
A: a1 → a2
↘
c1 → c2 → c3 → null
↗
B: b1 → b2 → b3
b
A: a1 → a2
↘ a
c1 → c2 → c3 → null
↗
B: b1 → b2 → b3
b
A: a1 → a2
↘ a
c1 → c2 → c3 → null
↗ b
B: b1 → b2 → b3
A: a1 → a2
↘ a
c1 → c2 → c3 → null
↗ b
B: b1 → b2 → b3
A: a1 → a2
↘ a = null, then a = b1
c1 → c2 → c3 → null
↗ b
B: b1 → b2 → b3
A: a1 → a2
↘
c1 → c2 → c3 → null
↗ b = null, then b = a1
B: b1 → b2 → b3
a
b
A: a1 → a2
↘
c1 → c2 → c3 → null
↗
B: b1 → b2 → b3
a
b
A: a1 → a2
↘
c1 → c2 → c3 → null
↗
B: b1 → b2 → b3
a
A: a1 → a2
↘ b
c1 → c2 → c3 → null
↗ a
B: b1 → b2 → b3
Since a == b
is true, end loop while(a != b)
, return the intersection node a = c1
.
Case 3 (Have No Intersection & Same Len):
a
A: a1 → a2 → a3 → null
B: b1 → b2 → b3 → null
b
a
A: a1 → a2 → a3 → null
B: b1 → b2 → b3 → null
b
a
A: a1 → a2 → a3 → null
B: b1 → b2 → b3 → null
b
a = null
A: a1 → a2 → a3 → null
B: b1 → b2 → b3 → null
b = null
Since a == b
is true (both refer to null), end loop while(a != b)
, return a = null
.
Case 4 (Have No Intersection & Different Len):
a
A: a1 → a2 → a3 → a4 → null
B: b1 → b2 → b3 → null
b
a
A: a1 → a2 → a3 → a4 → null
B: b1 → b2 → b3 → null
b
a
A: a1 → a2 → a3 → a4 → null
B: b1 → b2 → b3 → null
b
a
A: a1 → a2 → a3 → a4 → null
B: b1 → b2 → b3 → null
b = null, then b = a1
b a = null, then a = b1
A: a1 → a2 → a3 → a4 → null
B: b1 → b2 → b3 → null
b
A: a1 → a2 → a3 → a4 → null
B: b1 → b2 → b3 → null
a
b
A: a1 → a2 → a3 → a4 → null
B: b1 → b2 → b3 → null
a
b
A: a1 → a2 → a3 → a4 → null
B: b1 → b2 → b3 → null
a
b = null
A: a1 → a2 → a3 → a4 → null
B: b1 → b2 → b3 → null
a = null
Since a == b
is true (both refer to null), end loop while(a != b)
, return a = null
.
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA == null || headB == null) return null;
ListNode a = headA;
ListNode b = headB;
while(a != b){
a = a==null?headB:a.next;
b = b==null?headA:b.next;
}
return a;
}
}
根据两条链表的长度,从后续长度相同的位置同时开始向后遍历,如果两条链表存在交点,返回交点。
public static ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode p1 = headA, p2 = headB;
int len1 = 0, len2 = 0;
while (p1 != null) {
p1 = p1.next;
len1++;
}
while (p2 != null) {
p2 = p2.next;
len2++;
}
p1 = headA;
p2 = headB;
if (len1 > len2) {
for (int i = 0; i < len1 - len2; i++) {
p1 = p1.next;
}
} else {
for (int i = 0; i < len2 - len1; i++) {
p2 = p2.next;
}
}
while (p1 != p2) {
p1 = p1.next;
p2 = p2.next;
}
return p1;
}
LeetCode 160:Intersection of Two Linked Lists
原文:https://www.cnblogs.com/le-le/p/13028532.html