面试题 02.07. 链表相交
解题思路
- 首先找到两个链表相同长度的部分
- 因为两个链表拥有共同的部分 那么共同的部分一定是从等长度的位置开始的
- 然后依次开始比较节点的地址值
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
// 双指针 指针分别指向两个两个链表开头
// 不是比较数值相等 比较的是指针是否相等
// 因为两个链表拥有共同的部分 那么共同的部分一定是从等长度的位置开始的
ListNode curA = headA;
ListNode curB = headB;
int lenA = 0;
int lenB = 0;
// 计算链表A 的长度
while(curA != null){
lenA++;
curA = curA.next;
}
// 计算链表B的长度
while(curB != null){
lenB++;
curB = curB.next;
}
curA = headA;
curB = headB;
if(lenA < lenB){
int gap = lenB - lenA;// 求出长度差
// 让curA和curB在同一个起点
while(gap-- > 0){
curB = curB.next;// 移动curB 使得两个指针指向相同的位置
}
// 然后同时遍历curA 和curB 比较指针
while(curA != null){
if(curA == curB){
return curA;
}
curA = curA.next;
curB = curB.next;
}
}else{
int g = lenA - lenB;
while(g-- > 0){
curA = curA.next;
}
while(curA != null){
if(curA == curB){
return curA;
}
curA = curA.next;
curB = curB.next;
}
}
return null;
}
}