问题描述:
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
我的解题思路:
数据结构已经好久没碰过了,拿到这道题目,我一开始的想法居然是首先由链表生成两个int型的整数, 然后把他们加起来再生成一个新的链表。这种办法显然无法适用于特别大的整数,这时候用于存储整数的int变量会溢出。第一次提交没有通过之后,再仔细想想,才发现这道题考的是链表的操作问题,应当利用链表的指针来按位相加。最后写出的程序如下:
/**
* 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 flag=0;
ListNode * l1_st=l1;
ListNode * l2_st = l2;
ListNode * end;
ListNode * res_node=NULL;
ListNode * curr_node=NULL;
while((l1!=NULL)&&(l2!=NULL))/*两个链表都没结束*/
{
int sum = l1->val + l2->val+flag;
if(sum>=10)
{
sum = sum-10;
flag=1;
}
else
flag=0;
l1->val = sum;
l2->val = sum;
end=l1;
l1=l1->next;
l2=l2->next;
}
res_node = l1_st;
curr_node = l1;
/*两个链表都结束了,但是还有进位*/
if(l1==NULL&&l2==NULL&&flag==1)
{
ListNode * tmp = new ListNode(1);
end->next = tmp;
tmp->next=NULL;
return res_node;
}
if(l1==NULL&&l2==NULL&&flag==0)
{
return res_node;
}
/*l1结束,但是l2没有结束*/
if((l1==NULL)&&(l2!=NULL))
{
curr_node=l2;
res_node = l2_st;
}
while((curr_node!=NULL))
{
int sum = curr_node->val +flag;
if(sum>=10)
{
sum = sum-10;
flag=1;
}
else
flag=0;
curr_node->val = sum;
end=curr_node;
curr_node=curr_node->next;
}
if(flag==1&&curr_node==NULL)
{
ListNode * tmp = new ListNode(1);
end->next = tmp;
tmp->next=NULL;
}
return res_node;
}
};
这套题的难点在于要考虑多种情况,比如12+98,会引起进位从而得到3位数的结果110等等,需要在程序里面充分考虑这些情况。
编写程序的时候在结构体的初始化上面
ListNode * tmp = new ListNode(1);
还折腾了一小段时间,C++的结构体不同于一般C语言的结构体,还可以有构造函数,这是之前的一个知识盲点,以后要记住了。
关于链表的问题实质上就是操作指针的问题,在VS中输入测试的链表不大方便,可以在纸上画出来链表然后进行纸上Debug。