(一)题目要求:
你有两个用链表代表的整数,其中每个节点包含一个数字。数字存储按照在原来整数中相反
的顺序,使得第一个数字位于链表的开头。写出一个函数将两个整数相加,用链表形式返回和。
(二)示例:
给出两个链表 3->1->5->null
和 5->9->2->null
,返回 8->0->8->null
(三)题解:
方法一:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
//方法一:建立新链表逐个扫描原有l1,l2,逐位相加并出入新链表
//(1)carry : 进位 sum1 :l1 被加数 sum2: l2 被加数 insert_value : 结果
//(1)扫描l1,l2,只要有一个不为空,则计算结果
//(2)将结果插入新链表
//(3)l1,l2,新链表当前指针后移
//(4)跳出循环后如果carry不为0,则还需插入最高位 1
class Solution {
public:
/*
* @param l1: the first list
* @param l2: the second list
* @return: the sum list of l1 and l2
*/
ListNode * addLists(ListNode * l1, ListNode * l2) {
// write your code here
ListNode Dummy(0);
ListNode *tmp = &Dummy;
int carry = 0;
while(l1 || l2)
{
int sum1 = l1 ? l1->val :0;
int sum2 = l2 ? l2->val :0;
int sum = sum1+sum2+carry;
int insert_value = sum%10;
carry = sum/10;
tmp->next = new ListNode(insert_value);
tmp = tmp->next;
if (l1)
l1 = l1->next;
if (l2)
l2 = l2->next;
}
if(carry)
tmp->next = new ListNode(1);
return Dummy.next;
}
};
方法二:
//方法二:与一思路相同,不同是
//(1)将最高位进位的情况与其他情况同一,
//(2)利用carry进位保留当前计算结果,避免了过多临时变量
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
// 题意可以认为是实现高精度加法
ListNode *head = new ListNode(0);
ListNode *ptr = head;
int carry = 0;
while (true) {
if (l1 != NULL) {
carry += l1->val;
l1 = l1->next;
}
if (l2 != NULL) {
carry += l2->val;
l2 = l2->next;
}
ptr->val = carry % 10;
carry /= 10;
// 当两个表非空或者仍有进位时需要继续运算,否则退出循环
if (l1 != NULL || l2 != NULL || carry != 0) {
ptr = (ptr->next = new ListNode(0));
} else break;
}
return head;
}
};