本文主要是介绍给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
方案一:递归
思路:
1.判断链表是否为空,如果是空,返回相反的链表就是结果
2.依次取出两个链表的值进行相加,如果不用进位,就依次插入下一个节点 ,递归地调用,然后返回链表即可。
3.如果计算进位,先算这一位进位后的结果newList;再计算下一位要加多少carry;其次在考虑不进位的条件下,下一位的结果current;最后把carry 和 current 做加和,也就是下一位数插入下一个节点 ,递归调用返回即可。
4.递归的边界条件是有一个指针为空,返回另一个(条件1),不用做处理。
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {if(!l1){return l2;}if(!l2){return l1;}if(l1->val + l2->val < 10){ListNode* newList = new ListNode(l1->val+l2->val);newList->next = addTwoNumbers(l1->next,l2->next);return newList;}ListNode* newList = new ListNode((l1->val+l2->val)%10);ListNode* carry = new ListNode((l1->val+l2->val)/10);ListNode* current = addTwoNumbers(l1->next,l2->next);newList->next = addTwoNumbers(carry,current);return newList;}
};
方案二:插值法
创建一个和值进行保存两条链当前值和上次的进位,每次插入节点的都是和值的余数(也就是个位,sum %10),然后在记录十位也就是进位(sum / 10),进行下次链表值求和。
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {ListNode* head = new ListNode(-1);ListNode* pre = head;int sum = 0;while(l1 || l2 || sum){if(l1){sum += l1->val;l1 = l1->next;}if(l2){sum += l2->val;l2 = l2->next;}pre->next = new ListNode(sum % 10);pre = pre->next;sum /= 10;}return head->next;}
};
这篇关于给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!