怎样应对IT面试与笔试-(十五)

作者: Ice_Frog | 来源:发表于2018-05-30 22:00 被阅读15次

    Linked List 链表

    141. Linked List Cycle 判断单链表中是否有环

    使用到的数据结构:List
    使用到的算法技巧:Tow Pointers 辅助指针

    //设置两个指针,快指针每次走两步,慢指针每次走一步,如果链表有环,快指针肯定会与慢指针重合
    class Solution {
    public:
        bool hasCycle(ListNode *head) {
            if(head == NULL || head->next == NULL)
                return false;
            ListNode* slow = head;
            ListNode* fast = head->next;
            while(slow != fast)
            {
                if(fast == NULL || fast->next == NULL)
                    return false;
                slow = slow->next;
                fast = fast->next->next;
            }
            return true;
        }
    };
    

    这道题目同样也可以用哈希表

    class Solution {
    public:
        bool hasCycle(ListNode *head) {
            unordered_map<ListNode*,bool> hashnode;
            while(head != NULL)
            {
                if(hashnode[head] == true)
                    return true;
                hashnode[head] = true;
                head = head->next;
            }
            return false;
        }
    };
    

    160. Intersection of Two Linked Lists 找出两个链表的交点

    例子可参考题目中给出的:

    160.jpg

    使用到的数据结构:List

    //例如上面例子中,求得A链表长度是5,B链表长度是6,两者长度差是1,B链表结点先移动一步到b2,然后开始比较a1-b2、a2-b3,一直到c1-c1
    class Solution {
    public:
        ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
            if(headA == NULL || headB == NULL)
                return NULL;
            int alength = 0;
            int blength = 0;
            ListNode* pa = headA;
            ListNode* pb = headB;
            
            while(pa != NULL)
            {
                alength++;
                pa = pa->next;
            }
            while(pb != NULL)
            {
                blength++;
                pb = pb->next;
            }
            
            pa = headA;
            pb = headB;
            
            int step = alength - blength;
            if(step >0)
            {
                int astep = step;
                while(astep--)
                {
                    pa = pa->next;
                }
            }
            else
            {
                int bstep = -step;
                while(bstep--)
                {
                    pb = pb->next;
                }
            }
            
            while(pa != pb && pa != NULL && pb != NULL)
            {
                pa = pa->next;
                pb = pb->next;
            }
            return pa;
            
        }
    };
    

    这道题目同样可以用hash思想来解决

    class Solution {
    public:
        ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
            set<ListNode*> check;
            ListNode* pA = headA;
            while(pA != NULL)
            {
              //把链表A的结点依次放入set中
                check.insert(pA);
                pA = pA->next;
            }
            
            ListNode *pB = headB;
            while(pB != NULL)
            {
                //遍历B链表,查看每个结点在set中是否存在
                if(check.find(pB) != check.end())
                    return pB;
                pB = pB->next;
            }
            return NULL;
        }
    };
    

    怎样应对IT面试与笔试-(一)
    怎样应对IT面试与笔试-(二)
    怎样应对IT面试与笔试-(三)
    怎样应对IT面试与笔试-(四)
    怎样应对IT面试与笔试-(五)
    怎样应对IT面试与笔试-(五-1)
    怎样应对IT面试与笔试-(六)
    怎样应对IT面试与笔试-(七)
    怎样应对IT面试与笔试-(八)
    怎样应对IT面试与笔试-(九)
    怎样应对IT面试与笔试-(十)
    怎样应对IT面试与笔试-(十一)
    怎样应对IT面试与笔试-(十二)
    怎样应对IT面试与笔试-(十三)
    怎样应对IT面试与笔试-(十四)
    怎样应对IT面试与笔试-(十五)
    怎样应对IT面试与笔试-(十六)

    相关文章

      网友评论

        本文标题:怎样应对IT面试与笔试-(十五)

        本文链接:https://www.haomeiwen.com/subject/byzxsftx.html