首页 > 其他分享 >剑指offer——Day12 双指针(简单)

剑指offer——Day12 双指针(简单)

时间:2022-11-22 00:12:39浏览次数:48  
标签:遍历 ListNode offer nowA next 链表 Day12 NULL 指针

Day12 2022.11.18 双指针(简单)

25.合并两个排序的链表

自己实现

就用两个指针分开指向两个链表并进行遍历,比较之后放入新的列表里。

代码如下:

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        if(l1==NULL)return l2;
        if(l2==NULL)return l1;
        ListNode* now1;
        ListNode* now2;
        ListNode* res;
        if(l1->val>=l2->val)
        {
            res=new ListNode(l2->val);
            now1=l1;
            now2=l2->next;
        }
        else 
        {
            res=new ListNode(l1->val);
            now1=l1->next;
            now2=l2;
        }
        ListNode* now0=res;
        while(now1!=NULL&&now2!=NULL)
        {
            if(now1->val>=now2->val)
            {
                ListNode* tmp=new ListNode(now2->val);
                now0->next=tmp;
                now2=now2->next;
                now0=now0->next;
            }
            else
            {
                ListNode* tmp=new ListNode(now1->val);
                now0->next=tmp;
                now1=now1->next;
                now0=now0->next;
            }
        }
        if(now1==NULL)now0->next=now2;
        else if(now2==NULL)now0->next=now1;
        return res;
    }
};

代码表现

52.两个链表的第一个公共节点

自己实现

自己实现的思路就是遍历一个链表,将所有的节点都存进哈希表中,然后再遍历另一个链表,在每一个节点处在哈希表中寻找是否有该节点,这个思路比较简陋,时间关系没有实现,听Hongshuo Jia说题解很牛,直接尝试

题解

定义两个指针nowA nowB来遍历。nowA遍历链表A,nowB遍历链表B。任一指针遍历到尾节点即NULL时从另一链表的头开始继续遍历。

  • 假设两个链表有交叉的节点,那么两个指针都从尾节点重置到另一节点并继续遍历后,迟早会相遇,所以把while的循环判断条件设置为nowA != nowB即可。跳出循环后返回nowA就是答案。
  • 如果两个链表没有交叉节点,证明第二次遍历的时候有一个指针会再次到NULL,这个时候就证明没有交叉,直接返回NULL即可。

代码如下:

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        if(headA==NULL || headB==NULL)return NULL;
        ListNode* nowA=headA;
        ListNode* nowB=headB;
        int A=0;
        int B=0;
        while(nowA!=nowB)
        {
            nowA=nowA->next;
            nowB=nowB->next;
            
            if(nowA==NULL&&A==0)
            {
                nowA=headB;
                A=1;
            }
            if(nowB==NULL&&B==0)
            {
                nowB=headA;
                B=1;
            }
            if((nowA==NULL&&A==1) || (nowB==NULL&&B==1))return NULL;
        }
        return nowA;
    }
};

代码表现

hint:

  • 这个做法的灵感是通过数学恒等式得到的。假设链表A长度为a,链表B长度为b,交叉段长度为c。那么有a+(b-c) == b+(a-c)。所以如果有交叉节点,那么在遍历的时候一定会相遇
  • 多考虑两个指针一起遍历的方式,尝试模拟一下可能会有发现

标签:遍历,ListNode,offer,nowA,next,链表,Day12,NULL,指针
From: https://www.cnblogs.com/cspzyy/p/16913854.html

相关文章

  • 剑指offer——Day13 双指针(简单)
    Day132022.11.19双指针(简单)21.调整数组顺序使奇数位于偶数前面自己实现初步想法是一个指针从开头向右移动,移动到偶数停止;另一个指针从数组中间位置向右移动,移动到奇......
  • 剑指offer——Day11 2022.11.17 双指针(简单)
    Day112022.11.17双指针(简单)18.删除链表的节点自己实现直接遍历就行了代码如下:classSolution{public:ListNode*deleteNode(ListNode*head,intval){......
  • 百题_每日一题Day12
    将列表转换为字典。key=['laoda','laoer','laosan']value=['ha','haha','hahaha']di={}foriinrange(len(key)):di[key[i]]=value[i]--通过键值对形式赋值。......
  • VS2019 error C4703: 使用了可能未初始化的本地指针变量 "xx"
    在编译VS的时候,遇到这错误,根据参考资料,在”项目属性“-“C/C++”-“常规”-“SDL检查”,将其改为否。(参考资料提到的另一个方法是将指针声明时初始化为nullptr)另外,......
  • 数组与指针总结
    一.前言在复习C语言和写实验的过程中对于指针数组模块做出的一些初学者的总结与看法。二.指针简介1.从根本来看,指针是一个值为内存地址的变量。可编写如下程......
  • 老男孩教育 | 已婚已育,30岁转行做网安,三个月收获满意Offer!
    不够优秀,努力来凑~~~不要为懒散和懈怠找任何理由,每天给自己一个希望,路是靠自己走出来的,成功是靠自己努力得到的!!!俗话说:二十而冠,三十而立!30岁是人生分水岭,步......
  • 函数指针数组
    /* Function:函数指针数组*/#include<stdio.h>#include<stdlib.h>intfunc1(intn){printf("func1:%d\n",n);returnn;}intfunc2(intn){......
  • 调用函数指针
    /* DesignModel:设计模式 Function:使用函数指针列表搭建程序框架*/#include<stdio.h>#include<stdlib.h>inthello(inti);voidhey(inti);intsomeother(vo......
  • [力扣] 剑指 Offer 第四天 - 0~n-1中缺失的数字
    耐心和持久胜过激烈和狂热。题目来源来源:力扣(LeetCode)链接:​​https://leetcode.cn/problems/que-shi-de-shu-zi-lcof​​著作权归领扣网络所有。商业转载请联系官方授权,......
  • 指针
    指针是什么在计算机科学中,指针(pointer)是编程语言的一个对象,利用地址,它的值直接指向(pointsto)存在电脑存储器中的另一个地方的值.由于通过地址能够找所需的的变量单元。......