2.2.1两个数字相加
原创
©著作权归作者所有:来自51CTO博客作者喜欢打篮球的普通人的原创作品,请联系作者获取转载授权,否则将追究法律责任
文章目录
1.题目要求
- 题目:2 Add Two Numbers,链接
- 思路
(1)这道并不是什么难题,算法很简单,链表的数据类型也不难,就是建立一个新链表,然后把输入的两个链表从头往后撸,每两个相加,添加一个新节点到新链表后面。
为了避免两个输入链表同时为空,我们建立一个 dummy 结点,将两个结点相加生成的新结点按顺序加到 dummy 结点之后,由于 dummy 结点本身不能变,所以用一个指针 cur 来指向新链表的最后一个结点。
(2)好,可以开始让两个链表相加了,这道题好就好在最低位在链表的开头,所以可以在遍历链表的同时按从低到高的顺序直接相加
(3)while 循环的条件两个链表中只要有一个不为空行,由于链表可能为空,所以在取当前结点值的时候,先判断一下,若为空则取0,否则取结点值。
然后把两个结点值相加,同时还要加上进位 carry。然后更新 carry,直接 sum/10 即可,然后以 sum%10 为值建立一个新结点,连到 cur 后面,然后 cur 移动到下一个结点。之后再更新两个结点,若存在,则指向下一个位置。while 循环退出之后,最高位的进位问题要最后特殊处理一下,若 carry 为1,则再建一个值为1的结点
2.代码
单链表节点的定义如下:
单链表节点
struct ListNode
{
int val;
ListNode *next;
ListNode(int x): val(x), next(NULL) {}
};
class Solution
{
public:
ListNode* addTwoNumbers(ListNode* L1, ListNode* L2)
{
ListNode newlist(-1);
ListNode* head=&newlist;
int carry=0;
//ListNode* list1=L1;ListNode* list2=L2;
//for(list1,list2;list1!=NULL || list2!=NULL; list1=list1==NULL?NULL:list1->next, list2==list2==NULL?NULL:list2->next)
while(L1 || L2)
{
int L1_value=L1?L1->value:0;
int L2_value=L2?L2->value:0;
int sum=L1_value+L2_value+carry;
carry=sum/10;
int new_node_value=sum%10;
ListNode* node = new ListNode(new_node_value);
尾插方法
head->next=node;
head=head->next;
if (L1) L1=L1->next;
if (L2) L2=L2->next;
}
if (carry)
head->next=new ListNode(carry);
return newlist->next;
}
};