首页 > 其他 > 详细

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

时间:2015-08-28 17:31:05      阅读:124      评论:0      收藏:0      [点我收藏+]

思路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;
        
    }

 

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

原文:http://www.cnblogs.com/hupp/p/4766784.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!