【LeetCode】Add Two Numbers(两数相加)

这道题是LeetCode里的第2到题。

这道题的条件判断很简单,如下:

1.是否为尾节点

2.是否产生进位

3.是否等于9

4.是否需要拓展空间

代码如下:

ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
	ListNode *p = l1, *q = l2;
	int add, carry = 0;//carry标志进位

	while (1) {
		add = p->val + q->val + carry;
		p->val = add % 10;
		if (add > 9)carry = 1;
		else carry = 0;
		if (p->next == NULL || q->next == NULL)break;//直到最后一个节点
		p = p->next;
		q = q->next;
	}

    //这里就相当于是一个链表只有一个节点,另一个链表加上这个一个节点的数值
	if (p->next) {//list1
		p = p->next;
		q = p;
		while (carry) {//是否需要进位
			if (q->val == 9) {//是否等于9
				if (q->next == NULL) {//是否是最后一个节点
					q->val = 0;
					q->next = (ListNode*)malloc(sizeof(ListNode));
					q->next->val = 1;
					q->next->next = NULL;
					break;
				}
				q->val = 0;
				q = q->next;}
			else {q->val++;carry = 0;}
		}
		return l1;
	}

	if (q->next) {//list2
		q = q->next;
		list2 = q;//
		while (carry) {
			if (q->val == 9) {
				if (q->next == NULL) {
					q->val = 0;
					q->next = (ListNode*)malloc(sizeof(ListNode));
					q->next->val = 1;
					q->next->next = NULL;
					break;
				}
				q->val = 0;
				q = q->next;}
			else {q->val++;carry = 0;}
		}
		p->next = l2;
		return l1;
	}

	if (carry) {
		q = (ListNode*)malloc(sizeof(ListNode));
		q->next = NULL;
		q->val = 1;
		p->next = q;
	}
	return l1;
}

运行结果

?

个人总结:在设计算法初期,造成了许多代码的累赘,以上代码是经过优化后得到的。但是在这里两个if条件中还是会有代码的重复,但能够做出来我就已经很开心了。(^-^)V

  

原文地址:https://www.cnblogs.com/1000sakura/p/9972014.html

时间: 2024-08-06 22:47:50

【LeetCode】Add Two Numbers(两数相加)的相关文章

[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】2. Add Two Numbers 两数相加

You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list. You may assume the two numbers

LeetCode Add Two Numbers 两个数相加

1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode *creatnode(int a){ 12 ListNode *nod=new ListNode(a);

leetcode——Add Two Numbers 两个链表表示的正整数对其求和(AC)

You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list. Input: (2 -> 4 -> 3) + (5 -> 6 ->

Leetcode(2)两数相加

Leetcode(2)两数相加 [题目表述]: 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和.您可以假设除了数字 0 之外,这两个数都不会以 0 开头. 第一种方法:大众解法 执行用时:80 ms: 内存消耗:12.2MB # Definition for singly-linked list. # class ListNode(object

LeetCode 第2题 两数相加

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

leetcode刷题2:两数相加add_two_numbers

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

[LeetCode] Add Two Numbers 两个数字相加

You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list. Input: (2 -> 4 -> 3) + (5 -> 6 ->

Leetcode 002.两数相加

1.题目描述 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和. 您可以假设除了数字 0 之外,这两个数都不会以 0 开头. 示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807 2.易理解版本 2.1 解题思路 题中链表顺序正好是低