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

*/

原文地址:https://www.cnblogs.com/yangyalong/p/9693663.html

时间: 2024-10-06 00:28:23

C语言实现两数相加2018-09-23的相关文章

程序猿之---C语言细节20(符号和有符号之间转换、两数相加溢出后数值计算)

主要内容:无符号和有符号之间转换.两数相加溢出后数值计算 #include <stdio.h> /* 这个函数存在潜在漏洞 */ float sum_elements(float a[], unsigned length) { int i; float result = 0; for(i = 0; i <= length - 1; i++) { result += a[i]; printf("a[%d] = %f \n",i,a[i]); } return resul

程序员之---C语言细节20(符号和有符号之间转换、两数相加溢出后数值计算)

主要内容:无符号和有符号之间转换.两数相加溢出后数值计算 #include <stdio.h> /* 这个函数存在潜在漏洞 */ float sum_elements(float a[], unsigned length) { int i; float result = 0; for(i = 0; i <= length - 1; i++) { result += a[i]; printf("a[%d] = %f \n",i,a[i]); } return resul

Leetcode算法系列(链表)之两数相加

Leetcode算法系列(链表)之两数相加 难度:中等给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字.如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和.您可以假设除了数字 0 之外,这两个数都不会以 0 开头.示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807 链接:https://le

[CareerCup] 18.1 Add Two Numbers 两数相加

18.1 Write a function that adds two numbers. You should not use + or any arithmetic operators. 这道题让我们实现两数相加,但是不能用加号或者其他什么数学运算符号,那么我们只能回归计算机运算的本质,位操作Bit Manipulation,我们在做加法运算的时候,每位相加之后可能会有进位Carry产生,然后在下一位计算时需要加上进位一起运算,那么我们能不能将两部分拆开呢,我们来看一个例子759+674 1.

【LeetCode】- Two Sum(两数相加)

[ 问题: ] Given an array of integers, find two numbers such that they add up to a specific target number. The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please no

leetcode 2. 两数相加

给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807 1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val

【leetcode】 算法题2 两数相加

问题 给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807 代码实现 #include <vector> #include <map> #include <iostream>

链表表示的两数相加

给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表.你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807 代码一: 1 public ListNode addTwoNumbers(ListNode l1, ListNode l2) { 2 ListNode res

leetcode刷题2:两数相加add_two_numbers

题目:两数相加 (难度:中等) 给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字. 将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807 思路: 本题的思路很简单,按照小学数学中学习的加法原理从末尾到首位,对每一位对齐相加即可. 技巧在于如何处理不同长度的数字