leetcode 2 add two numbers
本文给出leetcode第二题Add Two Numbers的答案及所用到的简单知识总结,适用于C++初学者
本文代码[下载地址][4]
目录
题目
You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
按位相加法
#include<iostream>
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) {
int a = 0;
if(l1 == NULL)
return l2;
else if(l2 == NULL)
return l1;
else{
ListNode* head = new ListNode((l1->val + l2->val)%10);
a = (l1->val + l2->val)/10;
ListNode* temp = head;
l1 = l1->next;
l2 = l2->next;
while(l1!=NULL && l2!=NULL){
ListNode* list = new ListNode((l1->val + l2->val + a)%10);
a = (l1->val + l2->val + a)/10;
temp->next = list;
temp = list;
l1 = l1->next;
l2 = l2->next;
}
if(l1 == NULL){
while(l2!=NULL){
ListNode* list1 = new ListNode((l2->val + a)%10);
a = (l2->val + a)/10;
temp->next = list1;
temp = list1;
l2 = l2->next;
}
}
else{
while(l1!=NULL){
ListNode* list2 = new ListNode((l1->val + a)%10);
a = (l1->val + a)/10;
temp->next = list2;
temp = list2;
l1 = l1->next;
}
}
if(a!=0){
temp->next = new ListNode(a);
}
return head;
}
}
};
int main(){
int nums1[] = {9,9,9,9,9,9};
int nums2[] = {8};
ListNode* l1 = new ListNode(nums1[0]);
ListNode* l2 = new ListNode(nums2[0]);
ListNode* temp1 = l1;
ListNode* temp2 = l2;
for (int i=1;i<sizeof(nums1)/sizeof(int);i++){
ListNode* list3 = new ListNode(nums1[i]);
temp1->next = list3;
temp1 = list3;
}
for (int i=1;i<sizeof(nums2)/sizeof(int);i++){
ListNode* list4 = new ListNode(nums2[i]);
temp2->next = list4;
temp2 = list4;
}
temp1 = l1;
temp2 = l2;
cout<<"l1: "<<temp1->val;
temp1 = temp1->next;
while(temp1 !=NULL){
cout<<" "<<temp1->val;
temp1 = temp1->next;
}
cout<<endl<<"l2: "<<temp2->val;
temp2 = temp2->next;
while(temp2!=NULL){
cout<<" "<<temp2->val;
temp2 = temp2->next;
}
Solution t;
ListNode* result = t.addTwoNumbers(l1,l2);
cout <<endl<<"result: "<< result->val;
result = result->next;
while(result!=NULL){
cout<<" "<<result->val;
result = result->next;
}
system("pause");
return 0;
}
此题目我没有将链表 l1 和 l2 先转换为整数再相加最后转换为链表的格式,而是采用按位相加的方法。前者可能会造成溢出,因为我并未采用这种方法,所以具体怎样不是很清楚。
代码思路如下:首先判断 l1 与 l2 是否为空链表,若一方为空链表,结果即返回另一方的指针。当二者都不是空链表的情况下,按位相加,用变量 a 计算进位数值。
整个代码写得不是很美观,但可以执行功能。在leetcode上提交时,只需要粘贴 class Solution 类即可。
C++链表的实现
题目中预先给定程序
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
即链表中的结点包含一个 int 型的变量和指向下一个链表节点的指针变量。在此程序中,构造函数
ListNode(int x) : val(x), next(NULL) {}
定义了新建节点的方法,在程序中,我们使用
ListNode* head = new ListNode(a);
建立一个包含 a 的链表节点