LeetCode 2 两数相加
题目:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807
解题思路:
逐位扫描相加,这里要注意处理进位问题即可。
在提交这道题时,经常出现对 runtime error: member access within null pointer of type 'ListNode' 的问题,主要原因是我对一下还没有指定指向的指针进行数据成员操作,这会引起报错。参考了一下网上大牛的写法,在使用一个指针时就以初始化的形式进行赋值,如:
ListNode* p = new ListNode(-1);
p->next->val = x; //这是会报错的
为了解决上面这种情况,我们可以使用一下方法:
p->next = new ListNode(x);
代码:
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* addTwoNumbers(ListNode* l1, ListNode* l2) { 12 int JW = 0; 13 ListNode* ans = new ListNode(-1); 14 ListNode* p = ans; 15 while(l1 && l2) 16 { 17 if((l1->val + l2->val + JW) / 10 > 0) 18 { 19 p->next = new ListNode((l1->val + l2->val + JW) % 10); 20 JW = 1; 21 } 22 else 23 { 24 p->next = new ListNode(l1->val + l2->val + JW); 25 JW = 0; 26 } 27 l1 = l1->next; 28 l2 = l2->next; 29 p = p->next; 30 } 31 while(l1) 32 { 33 if((l1->val + JW) / 10 > 0) 34 { 35 p->next = new ListNode((l1->val + JW) % 10); 36 JW = 1; 37 } 38 else 39 { 40 p->next = new ListNode(l1->val+JW); 41 JW = 0; 42 } 43 l1 = l1->next; 44 p = p->next; 45 } 46 while(l2) 47 { 48 if((l2->val + JW) / 10 > 0) 49 { 50 p->next = new ListNode((l2->val + JW) % 10); 51 JW = 1; 52 } 53 else 54 { 55 p->next = new ListNode(l2->val + JW); 56 JW = 0; 57 } 58 l2 = l2->next; 59 p = p->next; 60 } 61 if(JW) 62 { 63 p->next = new ListNode(JW); 64 p = p->next; 65 } 66 return ans->next; 67 } 68 };