给你两个单链表的头节点 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;
}
ListNode cur1=headA;
ListNode cur2=headB;
int n=0;//n是差值
while(cur1!=null){
n++;
cur1=cur1.next;
}
while(cur2!=null){
n--;
cur2=cur2.next;
}
if(cur1!=cur2){return null;}
cur1=n>0?headA:headB;//cur1记录更长链表的头
cur2=cur1==headA?headB:headA;//cur2记录更短链表的头
n=Math.abs(n);//n取绝对值
while(n!=0){
n--;
cur1=cur1.next;//长链表走到和短链表长度相同的地方
}
while(cur1!=cur2){
cur1=cur1.next;
cur2=cur2.next;
}
return cur1;//两个指针同时走,直到走到相同的节点
}
}