一、问题描述
给定两个非空链表,其中链表中的每一个节点都是一个十以内的数字,链表的倒序数字串代表相应的十进制数值,因此每一个链表都会对应一个数值。题目中给定两个链表,需要求出其数值和,并将该数值和也相同的形式用链表表达,返回聊表的头结点。例如,给定聊表2->4->3和5->6->4,其代表的数值分别为342和465,数值和为907,将807用链表倒序表示为7->0->8,因此输出7->0->8链表的头结点。
二、思路分析
这道题思路有两种,第一种就是将两个链表根据定义将其转换成对应的十进制数,将两个十进制数相加后得到的结果再表达成链表的形式,这种方式的难点在于如何把十进制数用链表倒序进行表示,所需要的就是尾插法构建单链表的过程。而我选择的是另外一种思路,由于链表的读取顺序与十进制数的计算顺序一致,即十进制数的最低位恰好为链表的最高位,因此选择直接相加的办法。以长度更大的那条链表为结果链表,从头结点依次相加,如有进位则将进位用一个变量保存起来,并在下一个结点相加的时候加上进位值。当最后一个计算还存在进位时,则需要在结果链表尾部插入一个新节点。这种方法思路上更为简单,而且不需要额外的空间去存储结果,只是在链表操作的时候需要熟练。
三、代码实现
具体代码实现如下:
/**
* 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) {
int temp = 0,flag = 0;
ListNode* result;
ListNode* k;
ListNode* t;
if(ListLength(l1) > ListLength(l2)) {
result = l1;
k = l2;
while(l1 != NULL) {
if(l1->next == NULL) {
t = l1;
}
if(l2 == NULL) {
l1->val = l1->val + temp;
temp = l1->val / 10;
l1->val %= 10;
l1 = l1->next;
} else {
l1->val = l1->val + l2->val + temp;
temp = l1->val / 10;
l1->val %= 10;
l1 = l1->next;
l2 = l2->next;
}
}
if(temp == 0) {
return result;
} else {
t->next = k;
k->val = 1;
k->next = NULL;
}
} else {
result = l2;
k = l1;
while(l2 != NULL) {
if(l2->next == NULL) {
t = l2;
}
if(l1 == NULL) {
l2->val = l2->val + temp;
temp = l2->val / 10;
l2->val %= 10;
l2 = l2->next;
} else {
l2->val = l2->val + l1->val + temp;
temp = l2->val / 10;
l2->val = l2->val % 10;
l1 = l1->next;
l2 = l2->next;
}
}
if(temp == 0) {
return result;
} else {
t->next = k;
k->val = 1;
k->next = NULL;
}
}
return result;
}
int ListLength(ListNode* l) {
int len = 1;
while(l != NULL) {
len++;
l = l->next;
}
return len;
}
};