• Intersection of Two Linked Lists(链表)


    Write a program to find the node at which the intersection of two singly linked lists begins.
    For example, the following two linked lists:
    A:         a1 → a2
                          ↘
                           c1 → c2 → c3
                       ↗            
    B:     b1 → b2 → b3
    
    begin to intersect at node c1.

    题意:就是求取两个链表的交汇点,
    要求:无交汇点返回NULL,否则返回交汇点的地址。

    
    
    
    


    暴力思路:O(nm),固定A链表的第一个点,依次遍历B链表看是否有相同的点;接着固定A链表的第二个点,再依次遍历B链表,直到找到相同点为止。
    hash解:时间复杂度O(n+m),空间O(n)或者O(m)
    两指针解法:我们发现只要两个链表长度一样,就只需同时后移节点指针比较一个,若其中一个较长呢,其实处理一下,把两个链表变成一样长即可。
    解法步骤:
    1.求出两个链表的长度
    2.若一样长,无需处理;若其中一个较长,则只需让较长的链表先走abs(lengthA-lengthB)步即可
    3.同时后移节点指针,直到找到交汇点。
    代码:
    class Solution {
    private:
        int getLength(ListNode* head){
            if(head==NULL) return 0;
            ListNode* p=head;
            int res=0;
            while (p->next!=NULL)
            {
                ++res;p=p->next;
            }
            return res;
        }
    public:
        ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
            if(headA==NULL||headB==NULL) return NULL;
            int length_A=getLength(headA);
            int length_B=getLength(headB);
            ListNode* pA=headA;
            ListNode* pB=headB;
            int dis=0;
            if (length_A>length_B)
            {
                dis=length_A-length_B;
                while (dis>0)
                {
                    --dis;
                    pA=pA->next;
                }
            }else if(length_A<length_B)
            {
                dis=length_B-length_A;
                while (dis>0)
                {
                    --dis;
                    pB=pB->next;
                }
            }
            while (pA!=NULL&&pB!=NULL&&pA!=pB)
            {
                pA=pA->next;
                pB=pB->next;
            }
            if(pA==pB&&pA!=NULL) return pA;
            else return NULL;
        }
    };
     
  • 相关阅读:
    Rabbit官方文档翻译之Publish Subscribe(三)
    Maven项目导入本地Jar包
    位运算实现整数的加减乘数运算
    SpringMVC通过工具类获取Request域
    终止线程的2种方法。标记法和中断
    Spring 下默认事务机制中@Transactional 无效的原因
    java泛型 泛型的内部原理:类型擦除以及类型擦除带来的问题
    java.lang.Object.clone()分析
    我的Node.js学习历程
    setTimeout的妙用2——防止循环超时
  • 原文地址:https://www.cnblogs.com/fightformylife/p/4309810.html
Copyright © 2020-2023  润新知