LeetCode160. 相交链表


这题做法比较贼,让两个指针p, q分别指向两个链表的头,然后只要两个指针不为空且指向的位置不同,就都向后移动,当一个指针为空的时候,就指向另一个链表的头。

比如上面这图,假设相交部分之前,两个链表的长度分别是a,b,相交链表之后的长度为c。

那么p指针走了a + c长度(走完第一个链表)之后,指向第二个链表头headB;
q指针走了b + c长度(走完第二个链表)之后,指向第一个链表头headA。

然后两个指针又分别走了b和a的长度,最终,在经过a + b + c之后,两个指针终于相遇了。
这是两个链表有交点的情况。

如果两个链表没有交点,这种走法也是成立的。

比如上图,p走完第一个链表(经过a步),走到了第二个链表头headB;q走完第二个链表(经过b步),走到了第一个链表头headA。
然后它们右各自走了b步和a步,都到了NULL,注意,是NULL哦,两个指针都指向NULL了,也可以认为指向相同的位置,所以返回值是p(或者q也行,反正都是NULL)。

代码如下:

/**
 * 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) {
        auto p = headA, q = headB;
        while(p != q) {
            if(p != NULL) {
                p = p -> next;
            } else {
                p = headB;
            }
            if(q != NULL) {
                q = q -> next;
            } else {
                q = headA;
            }
        }
        return p;
    }
};
原文地址:https://www.cnblogs.com/linrj/p/13412309.html