1.题目:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
2.代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/*
直接修改l1节点数值。
考虑4种情况:1. l1和l2都存在,正常加就行,p1,p2同时后移;
2. l1存在l2为空,视p2->val==0,用情况一的方法操作,p1后移. eg.[0,1,1],[0,1];
3. l2存在l1为空,将p2接到p1后面,修改p1和p2成为情况2继续循环; eg.[0,1],[0,1,1]
4. l1和l2都为空,但有进位,新建个节点接在p1后面,退出循环; eg.[0,1],[0,9]
易知需要一个节点来存储p1=p1->next之前的p1,保证情况3,4能够正常接到p1->pre后面,初始化为temp->next=p1;
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
struct ListNode* p1=l1,*p2=l2;
struct ListNode* temp=(struct ListNode* )malloc(sizeof(struct ListNode));
temp->val=0;
temp->next=p1;
int carry=0,sum=0; //carry进位.
while(p1||p2||carry){
if(p1&&!p2){
sum=p1->val+carry;
carry=sum/10;
p1->val=sum%10;
temp=p1;
p1=p1->next;
}
if(p2&&!p1){
temp->next=p2;
p1=p2;
p2=NULL;
continue;
}
if(p1&&p2){
sum=p1->val+p2->val+carry;
carry=sum/10;
p1->val=sum%10;
temp=p1;
p1=p1->next;
p2=p2->next;
}
if(!p1&&!p2&&carry){
struct ListNode* node=(struct ListNode* )malloc(sizeof(struct ListNode));
node->val=1;
node->next=NULL;
temp->next=node;
carry=0;
}
}
return l1;
}
3.知识点:
初等数学知识,考虑情况要全面。