剑指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;

    }
时间: 2024-08-06 09:19:15

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

剑指offer-第五章优化时间和空间效率(从1到n的整数中1出现的次数)

题目:输入一个整数n,从1到n这n个十进制整数中1出现的次数. 思路1:对1到n中的任意一个数i对其进行求余数来判断个位是否为1,然后再求除数,判断十位是否为1.统计出1的个数.然后对1到n用一个循环将所有的数都加起来.时间复杂度为O(nlogn). 思路2:根据数字的规律来求.例如:21344这个数,我们将它分成两部分,第一部分为1345~21344.这部分我们可以先求出最高位上一出现的次数.又分为两种情况,10000~19999这种情况下最高位大于1,1出现的次数为10^4,另一种是1000

剑指offer-第五章优化时间和空间效率(数组中的逆序对的总数)

题目:在数组中如果两个数字的前面的数比后面的数大,则称为一对逆序对.输入一个数组求出数组中逆序对的总数. 以空间换时间:思路:借助一个辅助数组,将原来的数组复制到该数组中.然后将该数组分成子数组,然后统计子数组中内部的逆序,然后再统计两个相连的子数组中的逆序对,这个过程用到了归并排序.时间复杂度为O(nlogn). 如下图所示:

剑指offer-第五章优化时间和空间效率(在字符串中第一次出现切只出现一次的字符)

题目:在字符串中第一次出现切只出现一次的字符 思路:用HashMap来存放对应的char值和该char出现的次数.做一次变量就可以得到第一个只出现一次的字符. Java代码: import java.util.LinkedHashMap; //思路:用HashMap来存放对应的char值和该char出现的次数.做一次变量就可以得到第一个只出现一次的字符. public class FirstNotRepeatingChar { public Character firstNotRepeating

剑指offer-第5章优化时间和空间效率(丑数)

题目:我们把只包含因子2,3,5的数叫做丑数.寻找第1500个丑数.通常把1当成第一个丑数. 思路1:第一步判断是否为丑数:丑数是只包含2,3,5的数,因此一定可以被2,3,5整除.通过求余数是否为零做为判断条件,通过除以来减小整个数的值,知道整个数为1.返回true. 第二步找到第N个丑数的值,这一种做法的缺点是,不是丑数的数也要求余数除数的运算,因此耗时.因此我们提出一种以空间换时间的方法(谁让如今硬件更新的快呢).如2思路. 思路2:我采用一个数组按照从小到大的顺序存放丑数.数组中最后一个

剑指offer—第三章高质量代码(合并两个排序链表)

题目:输入员两个递增排序的链表,合并这两个链表并使新的链表中的结点仍然是按照递增排序的. 思路:首先,定义两个头节点分别为Head1和Head2的链表,然后比较第一个节点的值,如果是Head1->mValue比Head2->mValue小,那么头节点,就是Head1,递归实现后面的节点的排序. C++代码: #include<iostream> using namespace std; struct ListNode { int m_nValue; ListNode* m_pNex

【剑指offer】52、两个链表的第一个公共节点

题目 输入两个链表,找出它们的第一个公共结点. 思路一 因为是反向找,所以会想到用栈.将两个链表都压入两个栈,然后反向弹出,找出第一个公共节点.思路很简单 class Solution { public: ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) { stack<ListNode*> s1, s2; if (pHead1 == nullptr || pHead2 == nullptr) return n

【剑指offer】两个链表的第一个公共结点

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26097395 简单题,剑指offer上的第37题,九度OJ上AC. 题目描述: 输入两个链表,找出它们的第一个公共结点. 输入: 输入可能包含多个测试样例.对于每个测试案例,输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的两个链表的元素的个数.接下来的两行,第一行为第一个链表的所有元素,中间用空格隔开.第二行为第二个链表的所有元素,中间用空格隔开. 输出: 对应

剑指offer第4章

包含 \(min\) 函数的栈 ? 利用辅助栈,把每次的最小者(之前的最小元素和新压入栈的元素的两者中的较小值)都保存起来放到另一个辅助栈中. ? 栈的压入.弹出序列 ? 总结上述入栈.出栈的过程,我们可以找到判断个序列是不是栈的弹出序列的规律:如果下一个弹出的数字刚好是栈顶数字,那么直接弹出. 如果下一个弹出的数字不在栈顶,我们把压栈序列中还没有入栈的数字压 入辅助栈,直到把下一个需要弹出的数字压入栈顶为止.如果所有的数字 都压入栈了仍然没有找到下一个弹出的数字,那么该序列不可能是一个弹出序列

【Java】 剑指offer(17) 在O(1)时间删除链表结点

本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 思路 通常那样从头开始查找删除需要的时间为O(n),要在O(1)时间删除某结点,可以这样实现:设待删除结点i的下一个结点为j,把j的值复制到i,再把i的指针指向j的下一个结点,最后删除j,效果就相当于删除j. 注意特殊情况:1.当待删除结点i为尾结点时,无下一个结点,则只能从头到尾顺序遍历:2.当链