给你两个单链表的头节点 headA
和 headB
,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null
。
代码如下:
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
// 先求出链表A和链表B的长度
ListNode curA = headA;
ListNode curB = headB;
int lenA = 0,lenB= 0;
while (curA != null){
lenA ++;
curA = curA.next;
}
while (curB != null){
lenB ++;
curB = curB.next;
}
curA = headA;
curB = headB;
// 让curA为最长链表的头,lenA为其长度
if (lenB > lenA){
// 1 交换lenA和lenB
int tmplen = lenA;
lenA = lenB;
lenB = tmplen;
// 2 交换curA和curB
ListNode tmpNode = curA;
curA = curB;
curB = tmpNode;
}
// 求长度差
int gap = lenA - lenB;
// 让curA和curB在同一起点上(末尾位置对齐)
while (gap -- > 0 ){
curA = curA.next;
}
// 遍历curA和curB,遇到相同直接返回
while (curA != null){
if (curA == curB){
return curA;
}
curA = curA.next;
curB = curB.next;
}
return null;
}
class ListNode{
int val;
ListNode next;
public ListNode(int val) {
this.val = val;
}
public ListNode() {
}
public ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
}