剑指offer-第五章优化时间和空间效率(两个链表的第一个公共节点)

思路1:要求的是两个链表的第一个公共节点,首先想到的是用栈来存放两个链表,然后依次从栈中抛出,直到最后一个相同的节点为止。但是要用到两个栈,空间复杂度为O(n);

思路2:从头到尾分别遍历两个链表得到链表的长度风别为,len1和len2,求出两者的差值dif,然后现在长的链表上面走dif步,然后同步走剩下的节点,当就可以找到第一个公共节点了。

    public ListNode findFirstCommonNode(ListNode pHead1,ListNode pHead2){
        if(pHead1==null||pHead2==null)
            return null;
        int len1=0,len2=0;
        ListNode p1=pHead1,p2=pHead2;
        while(p1!=null){//获取第一个链表的长度
            len1++;
            p1=p1.m_pNext;
        }    
        while(p2!=null){//获取第二个链表的长度
            len2++;
            p2=p2.m_pNext;
        }
        int dif=len1-len2;
        ListNode longList=pHead1;//定义较长的链表
        ListNode shortList=pHead2;//定义较短的链表
        if(dif<0){
            longList=pHead2;
            shortList=pHead1;
            dif=len2-len1;
        }
        for(int i=0;i<dif;i++)
            longList=longList.m_pNext;//让较长的链表遍历差长的部分
        while(longList!=null&&shortList!=null&&
            longList!=shortList){//同时遍历两个链表,当遍历到同一个节点时,遍历停止。
                longList=longList.m_pNext;
                shortList=shortList.m_pNext;
            }
            
        
        ListNode firstCommonNode=longList;
        return firstCommonNode;
        
    }

 

posted @ 2015-08-28 16:00  lisahappy  阅读(366)  评论(0编辑  收藏  举报