题目链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists/
题目描述:
解题思路:
使用双指针,让指针p1和p2分别在两条链表上前进。当p1遍历完A链表后让它指向B链表头,开始遍历B链表,当p2遍历完B链表后让它指向A链表头,开始遍历A链表。这样拼接就相当于让p1和p2同时进入了公共的部分,也就是它们可以同时前进到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) {
ListNode p1 = headA, p2 = headB;
while(p1 != p2)
{
//p1走一步,如果走到A链表末尾,转到B链表
if(p1 == null) p1 = headB;
else p1 = p1.next;
//p2走一步,如果走到B链表末尾,转到A链表
if(p2 == null) p2 = headA;
else p2 = p2.next;
}
/*循环结束表明找到了p1和p2的相交节点,
如果两者不相交也会返回null*/
return p1;
}
}