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;
        }
    };
  • 相关阅读:
    [SHOI2015]自动刷题机
    【教程】AI画放射图
    AI画圆角矩形
    极限运动:街头极限单车,不只是牛逼!
    DPK750针式打印机驱动,750u.dll下载
    文艺青年必看的Ⅹ部心理电影
    C语言程序设计-第2章 算法-程序的灵魂
    C语言程序设计-第1章 程序设计和C语言
    20151127笔记
    20151125小概念
  • 原文地址:https://www.cnblogs.com/grandyang/p/6248101.html
Copyright © 2011-2022 走看看