zoukankan      html  css  js  c++  java
  • 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.

    Notes:

    • 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.
    • Your code should preferably run in O(n) time and use only O(1) memory.

    solution:

    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        if (headA == NULL || headB == NULL)
            return NULL;
        int lenA = 0;
        int lenB = 0;
        ListNode *pA = headA;
        while (pA != NULL)
        {
            ++lenA;
            pA = pA->next;
        }
        ListNode *pB = headB;
        while (pB != NULL)
        {
            ++lenB;
            pB = pB->next;
        }
    
        if (pA != pB)
            return NULL;
    
        pA = headA;
        pB = headB;
        
        if (lenA > lenB)
        {
            int k = lenA - lenB;
            while (k--)
            {
                pA = pA->next;
            }
        }
        else
        {
            int k = lenB - lenA;
            while (k--)
            {
                pB = pB->next;
            }
        }
        
        while (pA != pB)
        {
            pA = pA->next;
            pB = pB->next;
        }
        return pA;
    }

       上述解法来自《剑指offer》,还有一种基于Hashset的方法。

    solution:

    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        if (headA == NULL || headB == NULL)
            return NULL;
        unordered_set<ListNode*> st;
        while (headA != NULL)
        {
            st.insert(headA);
            headA = headA->next;
        }
        
        while (headB != NULL)
        {
            if (st.find(headB) != st.end())
                return headB;
            headB = headB->next;
        }
        return NULL;
    }
  • 相关阅读:
    恭介的法则
    229. Majority Element II
    169. Majority Element
    233. Number of Digit One
    172. Factorial Trailing Zeroes
    852. Peak Index in a Mountain Array
    162. Find Peak Element
    34. Find First and Last Position of Element in Sorted Array
    81. Search in Rotated Sorted Array II
    33. Search in Rotated Sorted Array
  • 原文地址:https://www.cnblogs.com/gattaca/p/4671846.html
Copyright © 2011-2022 走看看