zoukankan      html  css  js  c++  java
  • [LintCode] Intersection of Two Linked Lists 求两个链表的交点

    Write a program to find the node at which the intersection of two singly linked lists begins.

    Notice
    • If the two linked lists have no intersection at all, return null.
    • The linked lists must retain their original structure after the function returns.
    • You may assume there are no cycles anywhere in the entire linked structure.
     
    Example

    The following two linked lists:

    A:          a1 → a2
                       ↘
                         c1 → c2 → c3
                       ↗            
    B:     b1 → b2 → b3
    

    begin to intersect at node c1.

    Challenge

    Your code should preferably run in O(n) time and use only O(1) memory.

    LeetCode上的原题,请参见我之前的博客Intersection of Two Linked Lists

    解法一:

    class Solution {
    public:
        /**
         * @param headA: the first list
         * @param headB: the second list
         * @return: a ListNode
         */
        ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
            if (!headA || !headB) return NULL;
            int lenA = getLength(headA), lenB = getLength(headB);
            if (lenA < lenB) {
                for (int i = 0; i < lenB - lenA; ++i) headB = headB->next;
            } else {
                for (int i = 0; i < lenA - lenB; ++i) headA = headA->next;
            }
            while (headA && headB && headA->val != headB->val) {
                headA = headA->next;
                headB = headB->next;
            }
            return (headA && headB) ? headA : NULL;
        }
        int getLength(ListNode* head) {
            int cnt = 0;
            while (head) {
                ++cnt;
                head = head->next;
            }
            return cnt;
        }
    };

    解法二:

    class Solution {
    public:
        /**
         * @param headA: the first list
         * @param headB: the second list
         * @return: a ListNode
         */
        ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
            if (!headA || !headB) return NULL;
            ListNode *a = headA, *b = headB;
            while (a != b) {
                a = a ? a->next : headB;
                b = b ? b->next : headA;
            }
            return a;
        }
    };
  • 相关阅读:
    利用border-radius画椭圆
    关于使用svg构建六边形蜂巢列表的方式
    JavaScript拖拽效果的原理及实现
    逆战班-JS的形参与实参
    前端面试&笔试汇总
    less学习---less的混合(mixin)
    less学习---less的嵌套规则
    less学习----less变量
    vue-cli3实现将数据导出为Excel表
    js中apply和call方法浅析
  • 原文地址:https://www.cnblogs.com/grandyang/p/6248101.html
Copyright © 2011-2022 走看看