描述:
假定用一个链表表示两个数,其中每个节点仅包含一个数字。假设这两个数的数字顺序排列,请设计一种方法将两个数相加,并将其结果表现为链表的形式。
样例:
给出 6->1->7 + 2->9->5。即,617 + 295。
返回 9->1->2。即,912 。
思路:
先分别遍历两个链表,将两个链表中的数一个一个储存到整型数组中,对比两个链表的长度,即链表所代表的数的位数,如果不同则将位数小的那个数往所在数组的后面移动直到两个数的个位对齐,然后进行加法运算,并注意加法结束后最高位是否进1。最后在把运算结果从数组中提取出来连接成链表。
C++实现
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution
{
public:
/**
* @param l1: the first list
* @param l2: the second list
* @return: the sum list of l1 and l2
*/
ListNode *creatList(ListNode* pre, int val) {
ListNode *newNode = new ListNode(val);
pre->next = newNode;
return newNode;
}
ListNode *addLists2(ListNode *l1, ListNode *l2) {
// write your code here
if (l1 == NULL && l2 != NULL) return l2;
if (l1 != NULL && l2 == NULL) return l1;
if (l1 == NULL && l2 == NULL) return NULL;
int size1 = 1;
int size2 = 1;
int resultSize = 0;
ListNode *cur1 = l1;
ListNode *cur2 = l2;
int num1[300] = { 0 };
int num2[300] = { 0 };
int result[300] = { 0 };
memset(num1, 0, 300);
memset(num2, 0, 300);
memset(result, 0, 300);
if (cur1->next == NULL) {
num1[0] = cur1->val;
}
if (cur2->next == NULL) {
num2[0] = cur2->val;
}
while (cur1->next != NULL) {
num1[size1 - 1] = cur1->val;
size1++;
cur1 = cur1->next;
if (cur1->next == NULL) {
num1[size1 - 1] = cur1->val;
}
}
while (cur2->next != NULL) {
num2[size2 - 1] = cur2->val;
size2++;
cur2 = cur2->next;
if (cur2->next == NULL) {
num2[size2 - 1] = cur2->val;
}
}
cur1 = l1;
cur2 = l2;
if (size1 > size2) {
for (int i = 1; i <= size2; i++) {
num2[size1 - i] = num2[size2 - i];
num2[size2 - i] = 0;
}
int c = 0;
resultSize = size1 + 1;
for (int i = size1; i > 0; i--) {
result[i] = (c + (num1[i - 1] + num2[i - 1])) % 10;
if (c + num1[i - 1] + num2[i - 1] >= 10) c = 1;
else c = 0;
result[0] = c;
}
}
else if (size1 < size2) {
for (int i = 1; i <= size1; i++) {
num1[size2 - i] = num1[size1 - i];
num1[size1 - i] = 0;
}
int c = 0;
resultSize = size2 + 1;
for (int i = size2; i > 0; i--) {
result[i] = (c + (num1[i - 1] + num2[i - 1])) % 10;
if (c + num1[i - 1] + num2[i - 1] >= 10) c = 1;
else c = 0;
result[0] = c;
}
}
else if (size1 == size2) {
int c = 0;
resultSize = size2 + 1;
for (int i = size2; i > 0; i--) {
result[i] = c + (num1[i - 1] + num2[i - 1]) % 10;
if (c + num1[i - 1] + num2[i - 1] >= 10) c = 1;
else c = 0;
result[0] = c;
}
}
if (result[0] == 0) {
ListNode *head = new ListNode(result[1]);
ListNode *curR = head;
for (int i = 2; i < resultSize; i++) {
ListNode *acurR = creatList(curR, result[i]);
curR = acurR;
}
}
return head;
}
else if (result[0] == 1) {
ListNode *head = new ListNode(result[0]);
ListNode *curR = head;
for (int i = 1; i < resultSize; i++) {
ListNode *acurR = creatList(curR, result[i]);
curR = acurR;
}
}
return head;
}
}
};