[链表]–相交链表
题目链接
类似题型
题目
编写一个程序,找到两个单链表相交的起始节点。
如下面的两个链表:
在节点 c1 开始相交。
示例
输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
输出:Reference of the node with value = 8
输入解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。
输入:intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2
输出:null
输入解释:从各自的表头开始算起,链表 A 为 [2,6,4],链表 B 为 [1,5]。由于这两个链表不相交,所以 intersectVal 必须为 0,而 skipA 和 skipB 可以是任意值。
解释:这两个链表不相交,因此返回 null。
解析
双指针!romantic!携手共度余生,不然别相遇
说一下思路:定义双指针,pA从链表A出发,同一时间pB从链表B出发,pA遍历完A就去链表B,pB遍历完B就去链表A。这样的话,两个指针走的路程肯定一样啊,那么当A==B的时候?一定是相遇了或者都为null。显而易见的是,不论是哪种情况,直接返回其中一个指针不就好啦,要么是相交位置,要么是null。
代码实现
public class Solution160 {
/**
* Definition for a singly-linked list
*/
class ListNode {
int val;
ListNode next;
public ListNode(int val) {
this.val = val;
}
}
/**
* 1.定义两个指针遍历两个链表
* 2.遍历时每个指针都需要先后遍历两个链表, 也就是说两个指针 走过的路程 相同, 那么两者必定相遇(相交)或者同时到达各自的终点(不相交)
* 3.两个针织相遇时不是在 null 位置,就说明两个链表相交, 相遇位置就是相交位置
*/
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
// 判空
if (headA == null || headB == null) return null;
// 定义双指针
ListNode A = headA;
ListNode B = headB;
// 两个结点相遇时要么是相遇位置, 要么都遍历完为 null
while (A != B) {
// 两个指针分别先后遍历两个链表
A = (A == null) ? headB : A.next;
B = (B == null) ? headA : B.next;
}
return A;
}
}
-----------------------------------------------------------------------------有始有终分割线----------------------------------------------------------------------------------