题目:160. 相交链表
难度:EASY
思路
主要难点在于如何进行节点之间的对应。两条链表长度不定长,如何找到需要对比的节点至关重要。
我们从后往前看,我们需要对比的节点有什么特点。一个最大的特点就是后面的节点数相同。这就是我们的突破口。
解决这个问题,有两种方案。
第一种,遍历两个链表,计算出节点数,然后将节点数多的链表向后平移;第二种,定义两个指针,分别先后遍历两个链表。
代码
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
// p1 指向 A 链表头结点,p2 指向 B 链表头结点
ListNode *p1 = headA, *p2 = headB;
while (p1 != p2) {
// p1 走一步,如果走到 A 链表末尾,转到 B 链表
if (p1 == nullptr) p1 = headB;
else p1 = p1->next;
// p2 走一步,如果走到 B 链表末尾,转到 A 链表
if (p2 == nullptr) p2 = headA;
else p2 = p2->next;
}
return p1;
}
};