给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
图示两个链表在节点 c1 开始相交:
思路:
先计算两个链表的长度,规定某个指针指向长链表,剩下的那个指针指向短链表,再让两个链表尾部对齐,即让指向两个链表头结点的指针处在同一起跑线上,之后遍历链表找到第一个相同的结点返回。
注意:
链表相交指的是内存地址相等而不是存放元素的数值相等,且相交后,后续结点一定也都相同。
代码:
/**
* 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) {
if(headA==null || headB==null) return null;
int countA=0,countB=0;
ListNode pA=headA,pB=headB;
//统计A、B链条的长度
while(pA!=null){
countA++;
pA=pA.next;
}
while(pB!=null){
countB++;
pB=pB.next;
}
pA=headA;
pB=headB;
// 统一规定让curA为最长链表的头,lenA为其长度
if(countB>countA){
//交换两个链表的长度
int t=countA;
countA=countB;
countB=t;
//交换指向两个链表的指针
ListNode tmp=pA;
pA=pB;
pB=tmp;
}
int diff=countA-countB;
//移动指向长链表的指针pA,让两者到同一起点
for(int i=0;i<diff;i++){
pA=pA.next;
}
//判断是否相交(找到第一个相交的节点就返回。链表相交后,后面的结点一定都相等不需比较)
while(pA!=null){
if(pA==pB){
return pA;
}
pA=pA.next;
pB=pB.next;
}
return null;
}
}