Problem 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 do not contain any leading zero, except the number 0 itself.
Example:
1 2 3 Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) Output: 7 -> 0 -> 8 Explanation: 342 + 465 = 807.
Analysis 这题的设计的知识点是链表的操作和大数加法。使用链表可以存储很大的整数,这突破了int
类型的限制。解题思路是使用大数加法,逐位相加,通过进位的方式来计算出每一位的值。难点是遍历两个链表(长度可能不一样),且链表中存储的数据是倒叙的,即从低位到高位。
Solution 链表倒叙存储数据给我们的计算提供了方便,使得我们一开始就可以从地位开始计算,用add
记录每一位向高位的进位,然后存入下一位中。由于这样的算法,在最后一位中,我们有可能会多存一个0在高位,因此需要使用一个prev
指针指向前一个节点,当最后一个节点(最高位)为0时,prev
就是最后一位,即去除掉多余的一位。 需要特别注意当两条链长度不同的情况,需要使用三个while循环来计算,但里面的内容大部分都是一样的。
Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 class Solution {public : ListNode* addTwoNumbers (ListNode* l1, ListNode* l2) { ListNode* result = new ListNode(0 ); ListNode* temp = result; ListNode* prev; int digit; int add = 0 ; while (l1 != NULL && l2 != NULL ) { int sum = l1->val + l2->val + add; digit = sum % 10 ; add = sum / 10 ; temp->val = digit; temp->next = new ListNode(add); prev = temp; temp = temp->next; l1 = l1->next; l2 = l2->next; } while (l1 != NULL ) { int sum = l1->val + add; digit = sum % 10 ; add = sum / 10 ; temp->val = digit; temp->next = new ListNode(add); prev = temp; temp = temp->next; l1 = l1->next; } while (l2 != NULL ) { int sum = l2->val + add; digit = sum % 10 ; add = sum / 10 ; temp->val = digit; temp->next = new ListNode(add); prev = temp; temp = temp->next; l2 = l2->next; } if (temp->val == 0 ) { prev->next = NULL ; } return result; } };
运行时间: 约48ms,超过24.38%的CPP代码。
Summary 这题本身的难度不大,链表的操作也仅仅只是遍历与创建,稍微有难度的是通过一个prev
来剔除最后一个为0的节点。在算法方面,我对大数加法已经有了一定的熟悉程度,实现起来也不是很难,注意进位即可。本题的题析到这里,谢谢您的支持!