LeetCode 2.两数相加

两数相加 addTwoNumbers

  • 题目描述:
  • 给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。
  • 请你将两个数相加,并以相同形式返回一个表示和的链表。
  • 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1

LeetCode 2.两数相加

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.

分析:
  • 大体思路一样,但是在处理链表的细节上各有不同
  • 写法一:虚拟头节点
  1. 辅助指针: 首先需要一个虚拟头节点来储存辅助链表的头节点,即LisNode* dummyHead = new ListNode(-1);同时还需要一个指向当前节点的指针cur
  2. 链表节点加法:
    • 存在的难点:加法的进位
  • 加法实现:
    如:38 + 38 要怎么实现?想象一下如果 3 8 储存在一个数组里。即:arr1 = [8, 3];arr2 = [8, 3],这里如本题题干一样,从较低位数开始储存。
    • 需要一个carried标志进位
对于 38 + 38:
--因为 8 + 8 = 16,所以 carried = 1
即:16 / 10 = 1;
所以 carried = (8 + 8) / 10(进位)
	当前位数的和为 (8 + 8) % 10
代码如下:
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    	ListNode* dummyHead = new ListNode(-1);//虚拟头节点
    	ListNode* cur = dummyHead;//临时指针进行操作
    	int carried = 0;//进位标准
    	while (l1 || l2) {
    		carried += (l1 ? l1->val : 0) + (l2 ? l2->val : 0);
    		cur->next = new ListNode(carried%10);
    		carried /= 10;

			cur = cur->next;//指针下移
			l1 = l1 ? l1->next : nullptr;
			l2 = l2 ? l2->next : nullptr;
    	}
    	//处理高位进位情况,如 99+99
    	cur->next = carried ? new ListNode(1) : nullptr;
    	ListNode* ret = dummyHead->next;
    	delete dummyHead;
    	return ret;
    }
};

  • 写法二:“双指针”(官方解答)
  • 辅助指针: 一个head指针记录头节点地址, tail指针进行操作
代码如下:
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
		ListNode *head = nullptr, *tail = nullptr;
		int carry = 0;
		while (l1 || l2) {
			carry += (l1 ? l1->val : 0) + (l2 ? l2->val : 0);
			if (!head) {//处理初始的情况
				head = tail = new ListNode(carry%10);
			}else {
				tail->next = new ListNode(carry%10);
				tail = tail->next;
			}
			carry /= 10;

			l1 = l1 ? l1->next : nullptr;
			l2 = l2 ? l2->next : nullptr;
		}
		//处理最高位进位情况
		tail->next = carry ? new ListNode(1) : nullptr;
		return head;
    }
};
  • 结果:
执行用时:16 ms, 在所有 C++ 提交中击败了96.08%的用户
内存消耗:69.4 MB, 在所有 C++ 提交中击败了57.81%的用户
通过测试用例:
1568 / 1568
LeetCode 2.两数相加
根据提供的引用内容,Leetcode 2 "两数相加"是一个涉及链表的问题。该问题给定了两个非负整数,每个整数的每一位都是按照逆序的方式存储在链表中。我们需要将这两个链表相加,并返回一个新的链表作为结果。 具体解题思路可以使用迭代法或递归法来解决。迭代法的伪代码如下所示: ``` 初始化一个哑节点 dummy 和一个进位 carry,同时把两个链表的头节点分别赋值给 p 和 q 遍历链表,直到 p 和 q 都为 None 计算当前的和 sum 为 p.val + q.val + carry 计算当前的进位 carry 为 sum // 10 创建一个新节点 node,节点的值为 sum % 10 把新节点连接到结果链表的尾部 更新 p 和 q 分别为 p.next 和 q.next 如果最后还有进位 carry,则创建一个新节点 node,节点的值为 carry,并连接到结果链表的尾部 返回结果链表的头节点 dummy.next ``` 递归法的伪代码如下所示: ``` 定义一个辅助函数 addTwoNumbersHelper,输入为两个链表的头节点 p 和 q,以及进位 carry 如果 p 和 q 都为 None 且 进位 carry 为 0,则返回 None 计算当前的和 sum 为 p.val + q.val + carry 计算当前的进位 carry 为 sum // 10 创建一个新节点 node,节点的值为 sum % 10 设置新节点的下一个节点为递归调用 addTwoNumbersHelper(p.next, q.next, carry) 返回新节点 返回 addTwoNumbersHelper(p, q, 0) 的结果 以上是解决 Leetcode 2 "两数相加"问题的两种方法。如果你还有其他相关问题,请
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值