剑指Offer--52:找寻两个链表的相交节点
描述

方法一
/*
当我们走完各自的路 重新回到对方最初的地方
如果我们的缘分不是两条平行的线
那么一定会在第一次有交集的地方重新相遇
*/
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA == null || headB == null){
return null;
}
ListNode node1 = headA;
ListNode node2 = headB;
while(node1 != node2){
node1 = node1 == null ? headB : node1.next;
node2 = node2 == null ? headA : node2.next;
}
return node1;
}
}
方法二
1、先计算出两个链表的长度差
2、让较长的链表现在差值个位置
3、两个链表同时遍历,相等返回,没有相等的节点返回null
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA == null || headB == null){
return null;
}
ListNode node1 = headA;
ListNode node2 = headB;
int len1 = 0, len2 = 0;
while(node1 != null){
len1 ++;
node1 = node1.next;
}
while(node2 != null){
len2 ++;
node2 = node2.next;
}
node1 = headA;
node2 = headB;
// 计算差值
int cz = 0;
if(len1 > len2){
cz = len1 - len2;
for(int i = 0; i < cz; i++){
node1 = node1.next;
}
}
if(len1 < len2){
cz = len2 - len1;
for(int i = 0; i < cz; i++){
node2 = node2.next;
}
}
while(node1 != null && node2 != null){
if(node1 == node2){
return node1;
}else{
node1 = node1.next;
node2 = node2.next;
}
}
return null;
}
}
浙公网安备 33010602011771号