[leetcode]2. 两数相加

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.知识点:

初等数学知识,考虑情况要全面。

猜你喜欢

转载自blog.csdn.net/MJ_Lee/article/details/88219813