zoukankan      html  css  js  c++  java
  • 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;
        }
    };
    
  • 相关阅读:
    在Idea中使用Eclipse编译器
    Idea切换svn分支,类似Eclipse的Switch功能
    Spring AOP详解
    CGLib动态代理原理及实现
    IDEA下搜狗输入法输入中文时卡着不动的参考解决方法
    Nginx反向代理丢失cookie的问题
    redis连接池自动释放
    Redis常用命令
    waitpid之status意义解析
    bash中管道命令返回值如何确定(下)
  • 原文地址:https://www.cnblogs.com/linrj/p/13412309.html
Copyright © 2011-2022 走看看