题目:给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
图示两个链表在节点 c1 开始相交:


👍解题思路:
创建两个指针p1和p2,分别指向两个A、B链表的头结点,p1和p2指针同时移动。当p1和p2走到链表末尾时,分别指向另外一个链表的头结点,即:p1.next=headB,p2.next=headA。如此操作可实现将A、B两个链表进行合并和同时移动。最后当p1和p2相等时,即可证明两链表相交,返回p1结点。
注意❗:交点不是数值相等,而是指针相等。
我们把上面的链表设为A链表,下面链表设为B链表。

当p1走到A链表末尾时,指向B链表的头结点headB。(p2走到B链表末尾时,指向A链表的头结点headA。)


当p1与p2相等时,即可证明两链表相交。

代码如下:
/**
* 通过实现两个链表的同步移动来寻找相同节点
* @param headA
* @param headB
* @return p1
*/
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode p1=headA; //把A链表的头节点赋值给p1
ListNode p2=headB; //把B链表的头节点赋值给p2
//使两个链表同步并且同步移动
while (p1!=p2){
if (p1==null){ //当p1指针到达末尾时
p1=headB; //指向B链表的头结点
}else {
p1=p1.next;
}
if (p2==null){ //当p2指针到达末尾时
p2=headA; //指向A链表的头结点
}else {
p2=p2.next;
}
}
return p1; //最后返回p1
}
LeetCode160:相交链表解法
830

被折叠的 条评论
为什么被折叠?



