菜鸟LEETCODE刷题之路:2.两数相加

给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。

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

示例:

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

思路:循环两个指针按位置相加,并记录进位值,将相加的结果存在链表L1中,遇到一条链表结束后,循环结束,若L2链表较长,将L2链表的后半部分接到L1链表后,继续对L1链表值与进位值进行循环相加,直到进位值为0,最后需检查进位值是否为1,若为1,需在链表后添加节点1,时间复杂度O(N),空间复杂度O(1),将AC代码粘贴如下:

/**
 * 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 c=0;
    ListNode* h=l1;
    ListNode* p;
    while(l1->next!=NULL && l2->next!=NULL)
    {
        int s=l1->val+l2->val+c;
        if(s>=10)
        {
            s=s-10;
            c=1;
        } else
        {
            c=0;
        }
        l1->val=s;
        l1=l1->next;
        l2=l2->next;
    }
    int s=l1->val+l2->val+c;
    if(s>=10)
    {
        s=s-10;
        c=1;
    } else
    {
        c=0;
    }
    l1->val=s;
    if(l1->next==NULL)
    {
        l1->next=l2->next;
    }
    p=l1;
    l1=l1->next;
    while(l1!=NULL)
    {
        int s=l1->val+c;
        if(s>=10)
        {
            s=s-10;
            c=1;
        } else
        {
            c=0;
        }
        l1->val=s;
        p=l1;
        l1=l1->next;
    }
    if(c==1)
        p->next=new ListNode(1);
    return h;
}

};

感觉代码过于繁琐了,下面是简洁且高效的代码。

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode head(0) ,*p = &head;
        int carry = 0;
        while(l1 || l2 ||carry)
        {
            int sum = (l1 ? l1->val : 0) + (l2 ? l2->val : 0) +carry;
            carry = sum / 10;
            p->next = new ListNode(sum%10);
            p = p->next;
            l1 = l1 ? l1->next : l1;
            l2 = l2 ? l2->next : l2;
        }
        return head.next;

    }

思路很好,while(l1 || l2 ||carry)这一句很精髓,生成了一条新链表,使用了较多空间,不过节省了时间和代码量,很有借鉴意义。



};

你可能感兴趣的:(菜鸟LEETCODE刷题之路:2.两数相加)