题目网址:add two numbers
本题存在几个需要注意的地方:
(1)需要注意链表的进位问题,如果最后两个链表均为空,那我们需要判断是否存在进位问题,如果存在进位,那我们就必须产生一个新的节点,加入到新的节点的后面;
(2)链表是不一样长的时候,我们需要将已经提前结束的那个链表的节点的值设置为0,同样想加;
(3)这个链表的数字是倒序的存放的,反而简化了我们的操作,因为我们实现链表的位数分离的时候,先%10,再/10,这样实现单链表就是逆序的,之后会实现一个顺序的!
迭代写法
提交的代码:
/**
* 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) {
ListNode *newlistnode = new ListNode(0);
int x, y,carry=0;
ListNode *p = l1;
ListNode *q = l2;
ListNode *cur = newlistnode;
while (p || q){
x = p != NULL ? p->val : 0;
y = q != NULL ? q->val : 0;
int sum = x + y + carry;
cur->next =new ListNode(sum%10);
carry = sum / 10;
cur = cur->next;
if(p)
p = p->next;
if(q)
q = q->next;
}
if (carry != 0)
{
cur->next = new ListNode(1);
}
return newlistnode->next;
}
};
自己实现main函数的代码:
#include<iostream>
#include<algorithm>
using namespace std;
struct listnode{
int val;
listnode *next;
listnode(int x) :val(x), next(NULL) {}
};
class solution{
public:
listnode* addtwonumbers(listnode *l1, listnode *l2){//实现两数字的想加
listnode *newlistnode = new listnode(0);
int x, y,carry=0;
listnode *p = l1;
listnode *q = l2;
listnode *cur = newlistnode;
while (p || q){
x = p != NULL ? p->val : 0;//若链表已经走到最后,那么设置值为0,否则为那个节点的值
y = q != NULL ? q->val : 0;
int sum = x + y + carry;
cur->next =new listnode(sum%10);
carry = sum / 10;
cur = cur->next;
if(p)
p = p->next;
if(q)
q = q->next;
}
if (carry != 0)//如果最后还存在进位,那么我们就创建一个新节点加入到最后
{
cur->next = new listnode(1);
}
return newlistnode->next;
}
listnode *createlist(int n){//为输入的数字创建单链表
listnode *newlistnode = new listnode(0);
listnode *cur = newlistnode;
do{
cur->next = new listnode(n % 10);
n = n / 10;
cur = cur->next;
} while (n);
return newlistnode->next;
}
void output(listnode *l){//实现单链表的输出操作
listnode *cur = l;
while (cur)
{
cout << cur->val << " ";
cur = cur->next;
}
cout << endl;
}
};
int main()
{
int n, m;
while (cin>>n>>m){
solution s;
listnode *l1 = s.createlist(n);
listnode *l2 = s.createlist(m);
listnode *newlistnode = s.addtwonumbers(l1, l2);
s.output(newlistnode);
}
return 0;
}
在看到网上的代码之后,有使用递归的方法!
递归写法
a.如果两个节点都为空的话,则返回进位的节点,要么为空,要么为新创建的进位节点;
b.如果其中一个为空,那么我就要使得那个为空的节点的val等于0,实现另一个节点值和进位的加和;
c.如果均不为空,那么我们就需要实现两个节点和carry的和
/**
* 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) {
return rec(l1, l2, 0);
}
ListNode *rec(ListNode *l1, ListNode *l2, int carry){
if (l1 == NULL&&l2 == NULL){
return carry == 0 ? NULL : new ListNode(carry);
}
if (l1 == NULL&&l2 != NULL){
l1 = new ListNode(0);
}
if (l2 == NULL&&l1 != NULL){
l2 = new ListNode(0);
}
int sum = l1->val + l2->val + carry;
ListNode *cur = new ListNode(sum % 10);
cur->next = rec(l1->next, l2->next, sum / 10);
return cur;
}
};
只是粘贴了提交部分的代码,如果需要整个main函数,直接套用上面的就行!
之后再补上如果正序安放的数字的博客!