【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...
题目
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 -> 4)
- Output: 7 -> 0 -> 8
思路
其实不用考虑别的,就是两个数字相加,和传统加法唯一的不同就是此题中的加法是从左往右算的,进位也是从左往右进。
例子里给的就是
2 4 3
+ 5 6 4
——————————
7 0 8
正常加法应该先算3+4, 接着4+6,进一位,最后2+5,加之前的进位1,得到8;
在本题就应该先算 2+5, 接着4+6,进一位到3+4中,3+4+1=8,最后得到708。
对于两个list不等长的情况,就把短的list的末尾用0补齐就行了。
所以我直接遍历两个链表了,取出来的数相加放到新表里。当l1.next或者l2.next == null了,用0替代l1.val或l2.val。
最后还要注意当两个链表都遍历完,相加完之后,如果还有进位,要把进位的数字放到新list的末尾。比如 5 + 5 = 0->1
class Solution {
public:
ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) {
if(l1 == NULL || l2 == NULL) return (l1 == NULL) ? l2 : l1;
ListNode* p1 = l1;
ListNode* p2 = l2;
int carry = 0,num;//进位,和
ListNode* res = new ListNode(-1);//头结点
ListNode* p = res;
while(p1 != NULL || p2 != NULL || carry) {
num = (p1 ? p1->val : 0) + (p2 ? p2->val : 0) + carry;
carry = num >= 10 ? 1 : 0;
num %= 10;
ListNode* tmp = new ListNode(num);
p->next = tmp;
p = p->next;
if(p1) p1 = p1->next;
if(p2) p2 = p2->next;
}
return res->next;
}
};
};
结语
初始走在通往IT的道路上,虽然充满荆棘,但是只要能干倒这些荆棘,相信明天一定更美好!
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)