题目描述:
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。
图示两个链表在节点 c1 开始相交:
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
示例:
输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,6,1,8,4,5], skipA = 2, skipB = 3
输出:Intersected at '8'
解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,6,1,8,4,5]。
在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。
题目分析:此处的相交不是链表的值相等,而是两个链表从一个节点开始之后的节点完全一样。
- 若两个链表有交点,让A链表与B链表同时开始向后遍历,当发现A或者B到达终点时(Null),让其从对方链表的链表头开始出发,继续向后遍历,依次类推,最终A和B一定会在相交点汇合。
- 而当A和B没有交点,走完自己的路之后继续走对方的路,则两者同时会走到null。
- 终止条件就是A和B相等。
代码实现:
/**
* 相交链表
*/
public class Num160 {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode pA = headA,pB = headB;
//1.相交时刚好返回交点;
//2.不想交两个同时走到null;
while(pA != pB){
pA = pA == null ? headB : pA.next;
pB = pB == null ? headA : pB.next;
}
return pA;
}
}