• C语言实现两数相加2018-09-23


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

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

    示例:

    输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
    输出:7 -> 0 -> 8
    原因:342 + 465 = 807*/
    /**
    * Definition for singly-linked list.
    * struct ListNode {
    * int val;
    * struct ListNode *next;
    * };
    */
    struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
    {
    struct ListNode *p = NULL, *q = NULL, *head = NULL;

    int index = 0, x, y, sum = 0;

    while (l1 != NULL || l2 != NULL)
    {
    x = (l1 != NULL) ? l1->val : 0; /*当l1非空时x等于l1所指向的值*/
    y = (l2 != NULL) ? l2->val : 0; /*当l2非空时y等于l2所指向的值*/

    sum = x + y + index; /*求和的时候记得加上用来进位的index*/

    p = (struct ListNode*)malloc(sizeof(struct ListNode));
    if (p != NULL) /*当节点分配成功*/
    {
    p->val = sum % 10; /*对和求余数*/
    index = sum / 10; /*计算是否需要进位*/
    p->next = NULL;
    }
    if (q == NULL) /*才产生了一个节点的时候,让head指向该节点*/
    {
    q = p;
    head = q;
    }
    else
    {
    q->next = p; /*将每一个节点连接起来*/
    q = p;
    }
    /*判断l1是否已经指向了一个空节点,这一步很重要, 也很危险,切记不能写成if(l1->next!NULL)这样会产生死循环(l1和l2一直指向最后一个节点)*/
    if (l1)
    l1 = l1->next;
    if (l2)
    l2 = l2->next;
    }
    if (index == 1) /*当最后一个节点相加超过10了,需要再产生一个节点来完成进位*/
    {
    p = (struct ListNode*)malloc(sizeof(struct ListNode));
    if (p != NULL)
    {
    p->val = 1;
    p->next = NULL;
    q->next = p;
    q = p;
    }

    }
    return head;
    }
    /*心得:

    *1、写过程略微复杂一点的程序一定要写好伪代码,然后在写的过程中再转化为标准C语言;

    *2、对于指针的使用,在指针改变指向,即移动或者交换的时候一定要留心,当指针移动的时候出现麻烦,可以往后思考一步到两步,就可以发现其问题;

    *3、对于相似问题的求解,一定要学会归纳一个模型,即使用几行代码就可以实现一系列相似问题的求解。

    */

  • 相关阅读:
    对获取的DataTable表进行过滤筛选得到DataView
    简单提取iOS13的ipsw固件的内置壁纸(或文件)
    win10设置Python程序定时运行(设置计划任务)
    后端返回一个这种类型的时间格式给前端2020-01-16T09:10:02.349Z
    js把每个词的首字母转大写
    idea连接mysql自动生成实体类
    el自定义函数
    js日期时间格式化
    js大小写转换
    js瞄点
  • 原文地址:https://www.cnblogs.com/yangyalong/p/9693663.html
Copyright © 2020-2023  润新知