力扣HOT100之链表:160. 相交链表
这道题已经刷过三四回了,看到这道题就直接秒了,纯数学技巧,我们直接用两个指针变量分别保存headA
和headB
指向的地址,然后直接在一个while
循环中分别遍历两个链表,当遍历到A
链表的末尾时(headA == nullptr
),立刻将headA
赋值为B
链表的首元素地址,继续遍历,同理,当遍历到B
链表的末尾时,直接将headB
赋值为A
链表的首元素地址,并继续遍历,当headA==headB
时退出while
循环,然后直接返回headA
即可。
上述的while循环一定会退出,而不会无限循环下去,当while循环退出的时候,headA和headB都指向相同的节点,这是必然的,下面简单用两个例子来说明:
上面是两个链表相交的情况,下面是两条链表不相交(可以认为是广义的相交,因为两个链表的末尾都指向空节点)的情况,headA
的遍历路径用黑色数字表示,headB
的遍历路径用红色数字表示,可以看出,在上面的例子中,总共经过了10步,headA
和headB
共同指向了C1
节点,这就是两条链表的交点。在下面的例子中,总共经过了9步,headA
和headB
都指向了两条链表的“交点”nullptr
,然后直接将headA
或headB
返回即可,如果两条链表相交,那么返回的就是他们真正的交点,如果两个链表没有相交,返回的就是空指针,所以代码写出来特别简洁。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode* A = headA;
ListNode* B = headB;
while(headA != headB){
headA = headA ? headA -> next : B;
headB = headB ? headB -> next : A;
}
return headA;
}
};