两数相加
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
代码:
/**
* 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 *head = new ListNode(0),*p;
//p的作用是使结点相连接,head的作用是保存头节点地址以供返回
p = head;
int flag = 0; //进位
while(l1 || l2 || flag)
{
int tmp = 0;
if(l1 != NULL) tmp += l1->val;
if(l2 != NULL) tmp += l2->val;
tmp += flag;
flag = tmp / 10;
tmp %= 10;
ListNode *next = new ListNode(tmp);
//使p的next指针指向新的结点,然后向后移动p指向的结点
p->next = next;
p = p->next;
//判断l1 l2是否还有剩余 如果有返回next 否则返回NULL
l1 = l1?l1->next:NULL;
l2 = l2?l2->next:NULL;
}
return head->next; //head头为初始化时的0 不应该取0 所以返回head的next
}
};
总结该题涉及知识点:
- 链表的创建
该题中链表的创建
ListNode *next = new ListNode(tmp);
//使p的next指针指向新的结点,然后向后移动p指向的结点
p->next = next;
p = p->next;
其他场景:
// 创建单链表
ListNode *creat(vector<int> v)
{
ListNode *head, *p;
head = new ListNode(0);
p = head;
for(unsigned int i=0;i<v.size();i++)
{
ListNode *s = new ListNode(v[i]);
p->next = s;
p = p->next;
}
p->next = NULL;
return head->next;
}
- 链表取值
tmp += l1->val;
- 链表总结
#include <bits/stdc++.h>
using namespace std;
struct ListNode
{
int val;
ListNode *next;
ListNode(int x):val(x),next(NULL){}
};
// 创建单链表
ListNode *creat(vector<int> v)
{
ListNode *head, *p;
head = new ListNode(0);
p = head;
for(unsigned int i=0;i<v.size();i++)
{
ListNode *s = new ListNode(v[i]);
p->next = s;
p = p->next;
}
p->next = NULL;
return head->next;
}
// 单链表打印
void printL(ListNode *head)
{
ListNode *p = head;
while (p != NULL)
{
cout << "Single Linker data is " << p->val << endl;
p = p->next;
}
}
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
{
ListNode *head = new ListNode(0),*p;
//p的作用是使结点相连接,head的作用是保存头节点地址以供返回
p = head;
int flag = 0; //进位
while(l1 || l2 || flag)
{
int tmp = 0;
if(l1 != NULL) tmp += l1->val;
if(l2 != NULL) tmp += l2->val;
tmp += flag;
flag = tmp / 10;
tmp %= 10;
ListNode *next = new ListNode(tmp);
//使p的next指针指向新的结点,然后向后移动p指向的结点
p->next = next;
p = p->next;
//判断l1 l2是否还有剩余 如果有返回next 否则返回NULL
l1 = l1?l1->next:NULL;
l2 = l2?l2->next:NULL;
}
return head->next; //head头为初始化时的0 不应该取0 所以返回head的next
}
int main()
{
vector<int> vec;
vec.push_back(3);
vec.push_back(4);
vec.push_back(5);
cout << "***创建单链表l1***" << endl;
ListNode *l1 = creat(vec);
cout << endl;
cout << "***创建单链表l2***" << endl;
ListNode *l2 = creat(vec);
cout << endl;
ListNode *result = addTwoNumbers(l1,l2);
cout << "***打印单链表l1***" << endl;
printL(l1);
cout << endl;
cout << "***打印单链表l2***" << endl;
printL(l2);
cout << endl;
cout << "***结果:***" << endl;
printL(result);
cout << endl;
return 0;
}
结果:
***创建单链表l1***
***创建单链表l2***
***打印单链表l1***
Single Linker data is 3
Single Linker data is 4
Single Linker data is 5
***打印单链表l2***
Single Linker data is 3
Single Linker data is 4
Single Linker data is 5
***结果:***
Single Linker data is 6
Single Linker data is 8
Single Linker data is 0
Single Linker data is 1