• 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、对于相似问题的求解,一定要学会归纳一个模型,即使用几行代码就可以实现一系列相似问题的求解。

    */

  • 相关阅读:
    Java第一次作业
    第十一次作业
    第十次作业
    第九次作业
    第八次作业
    第七次作业
    第六次作业
    第五次作业
    java第三次实验
    java 第二次实验
  • 原文地址:https://www.cnblogs.com/yangyalong/p/9693663.html
Copyright © 2020-2023  润新知