【LeetCode】T2 两数相加(C++)

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

几个容易忽略的输入:

[9,8]
[1]
[2,4,3]
[5,6,4]
[5]
[5] 

一开始把题目想的特别简单,直接逐位加就行了,甚至链表已经是逆序了都不用再逆算。

代码如下(来回折腾几个特殊情况,就突然想换个方式去算):

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    //ListNode * add(ListNode*)
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode * result = l1;
        ListNode* pre = NULL;
        ListNode * HEAD = result;
        int value = 0;
        if(l1 == NULL || l2 ==NULL){  //特殊输入
            return l1==NULL?l1:l2;
        }
        if(l1->val == 0 || l2->val ==0){  //特殊输入
            return l1->val==0?l2:l1;
        }
        while(result!=NULL && l2!=NULL){
            result->val = result->val + l2->val+ value;
            if(result->val>=10){   //进位判断
                value = result->val  /10;
                result->val %=10;
            } 
            else{
                value = 0;
            }
            if(l2->next ==NULL && result->next!=NULL){   //2比1短
                pre = result;
                result = result->next;
                if(value==0){
                    result->val += value;
                    value = 0;
                }
                
                break;
            }
            else if(l2->next!=NULL && result->next == NULL){  //1比2短
                while(l2->next!=NULL){
                    pre = result;
                    result = l2->next;
                }
                break;
            }
            pre = result;
            result = result->next;
            l2 = l2->next;
        }
        if(value!=0){  //create new point
            result = pre;
            ListNode *newPoint = new ListNode(value);
            newPoint->val = value;   //为超出的进位创建新结点
            result->next = newPoint; 
            result = result->next;
        }
        return HEAD;
    }
};

然而链表长短各不相同来回折腾样例半天,突然想到一个更直接的方式……

分开算,不用这样每次一起算。上一个方法等同于把2往1上加,所以要判断长短不同的情况。

分开算直接创建一个新的链表,每次循环创建一个结点即可。

class Solution {
public:
    //ListNode * add(ListNode*)
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode * HEAD = new ListNode(0);
        ListNode * tmp = HEAD;
        int value = 0;
        while(l1!=NULL || l2!=NULL){
            if(l1){
                value += l1->val;
                l1 = l1->next;
            }
            if(l2){
                value += l2->val;
                l2 = l2->next;
            }
            //deal with sum
            tmp->next = new ListNode(value%10);
            value /= 10;
            tmp = tmp->next;
        }
        if(value){
            tmp->next = new ListNode(1);
        }
        return HEAD->next;
    }
};

猜你喜欢

转载自blog.csdn.net/PPPPluie/article/details/88954200