zoukankan      html  css  js  c++  java
  • Leetcode(2)-两数相加(包含链表操作的注意事项)

    给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。

    你可以假设除了数字 0 之外,这两个数字都不会以零开头。

    示例:

    输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
    输出:7 -> 0 -> 8
    原因:342 + 465 = 807

    思路:类似于将两个链表融合成一个链表,首先如果有一个链表为空,那么就返回另外一个链表的头结点。如果都不为空,就可以进行相加操作,这里涉及到求和和保存进位的操作。我下面主要记录新建链表的过程中需要注意的地方。

    (1)如果newhead = 已有的链表,那么newhead->next是有效的,相当于新建的链表指向了已有的链表,只要已有的这个链表有后面的节点,那么访问next就是合法的

    (2)如果我们的做法是新建一个链表的头结点,准备一个个的自己加节点,那么就要注意一定要提前申请好下一个节点的空间,才能对newhead->next做操作

    (3)一般在链表的定义部分,要定义一个初始化函数,比如将val初始化为num,将next指针定义为NULL。这样方便初始化一个单独的节点。这样初始化的结果是什么呢。比如ListNode* p= new ListNode(0); 就是p的当前值是0,p->next中val未知,next未知。这个时候可以对p->next做NULL判断,但不可以做其他赋值的操作,否则会有内存访问出错。

    (4)如果要加入节点的话。尽量对下一节点做处理,比如我想在链表加入一个值,那么如果p->val=num的话,这个时候p->next是未知的状态,p=p->next这句话没错,这个相当于现在p是未知的状态了。如果还想加入一个值,就很麻烦了,直接用p->val=num会出现内存出错,因为这个时候的p已经是不可访问的了。所以尽量p->next = new ListNode(num),p=p->next。这样p永远指向链表尾端,不加新节点,也不会多申请,加的话,申请一个新的,加到后面。但是这样返回的值,要变成head->next

    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
    {
        ListNode *first=l1,*sec=l2,*result;
        if(first==NULL) return l2;
        if(sec==NULL) return l1;
        int sum = 0,carry =0;
        result = new ListNode;
        ListNode* p = result;
        while(first && sec)
        {
            sum= first->val + sec->val + carry;
            p->next = new ListNode(sum%10);
            carry = sum/10;
            p=p->next;
            first=first->next;
            sec=sec->next;
        }
        if(first)
        {
            p->next=first;
        }
        else if(sec)
        {
            p->next=sec;
        }
        while(carry !=0 && p->next !=NULL)
        {
            p=p->next;
            p->val += carry;
            carry = 0;
            if(p->val>9)
            {
                p->val -= 10;
                carry = 1;
            }
        }
        if(carry)
        {
            p->next = new ListNode(carry);
        }
        return result->next;
    }

    最后要注意,当两个链表都遍历结束的时候,还要判断下carry位,是1的话,需要再增加一位的,否则会丢失最高位



  • 相关阅读:
    HTMLElement.dataset
    toLocaleString
    export,import ,export default是什么
    css鼠标禁用
    npm ERR! cb() never called! npm ERR! This is an error with npm itself.错误解决办法
    vue3的新特性
    el-dialog开启拖拽功能
    yarn config get registry
    JS中的函数防抖
    注入攻击的解决思路
  • 原文地址:https://www.cnblogs.com/mini-coconut/p/9013122.html
Copyright © 2011-2022 走看看