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.

    开始想道用栈来做,先入栈,然后出栈比较直接就出结果了,但是题目说只能利用一个空间,所以栈的方法不行了。

    看网上的答案,没想到这么简单,暴力解法,什么算法、数据结构都没用,题刷多了,脑袋都僵了,一直以为要用什么算法来做呢。。。。

    思路:

    查找两个链表的第一个公共节点,如果两个节点的尾节点相同,肯定存在公共节点

    方法: 长的链表开始多走 (h1的数量 - h2的数量)步,然后和短链表同步往下走,遇到的第一个相同的节点就是最早的公共节点

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
            if(headA==NULL||headB==NULL)
               return NULL; 
            ListNode *flagA=headA;
            ListNode *flagB=headB;
            int countA=1;
            int countB=1;
            while(flagA->next!=NULL)
            {
                countA++;
                flagA=flagA->next;
            }
            while(flagB->next!=NULL)
            {
                countB++;
                flagB=flagB->next;
            }
            if(flagA!=flagB)
                return NULL;
            else
            {
                int diff=abs(countA- countB);
                if(countA>=countB)
                {
                    flagA=headA;
                    flagB=headB;
                }
                else
                {
                    flagA=headB;
                    flagB=headA;
                }
                while(diff)
                {
                    flagA=flagA->next;
                    diff--;
                }
                while(flagA!=flagB)
                {
                    flagA=flagA->next;
                    flagB=flagB->next;
                }
                return flagA;
            }
        }
    };

      

  • 相关阅读:
    小希的迷宫
    不下降序列
    Stones on the Table
    glsl之纹理演示
    glsl之多重纹理演示
    6.12
    这狗日的生活
    小楼一夜听春雨,天下谁人不识君?
    lua 调用C/C++
    D3DFVF_XYZ和D3DFVF_XYZRHW的区别
  • 原文地址:https://www.cnblogs.com/qiaozhoulin/p/4758718.html
Copyright © 2011-2022 走看看