• 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;
        }
    };
    
  • 相关阅读:
    经典线程同步总结 关键段 事件 互斥量 信号量
    寄存器与缓存的区别
    自动变量
    进程的阻塞和挂起的区别
    经典线程同步 信号量Semaphore
    热门智力题 过桥问题和倒水问题
    经典线程同步 互斥量Mutex
    解决面试题的思路
    java.util.LinkedHashMap cannot be cast to
    E11000 duplicate key error index
  • 原文地址:https://www.cnblogs.com/linrj/p/13412309.html
Copyright © 2020-2023  润新知