LeetCode OJ--Add Two Numbers

http://oj.leetcode.com/problems/add-two-numbers/

将用链表表示的两个数相加,(2 -> 4 -> 3) + (5 -> 6 -> 4) 就是342 + 465.刚开始把题目给理解错了,做复杂了。

主要是对指针的理解。

ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) {
        // IMPORTANT: Please reset any member data you declared, as
        // the same Solution instance will be reused for each test case.
        if(l1==NULL)
            return l2;
        if(l2==NULL)
            return l1;
        int sum;
        int carry = 0;
         
        ListNode *ans = l1;
        ListNode *ans3 = ans;
        //最后结果存到l1 ans
        while(l1&&l2)
        {
            sum = l1->val + l2->val + carry;
            carry = sum/10; 
            if(carry)
                l1->val = sum - 10;
            else
                l1->val = sum;
            l1 = l1->next;
            l2 = l2->next;
        }
        if(l1==NULL &&l2==NULL)
        {
            if(carry == 0)
                return ans;

            //找到最后一个节点
            while(ans3->next)
                ans3 = ans3->next;
            ListNode *temp =  new ListNode(1);
            ans3->next = temp;
            return ans;
        }
        //将两种情况化成一种
        if(l1 == NULL)
        {
            while(ans3->next)
                ans3 = ans3->next;
            ans3->next = l2;
            l1 = l2;
            l2 = NULL;
        }
         
        //要看最高位进位的情况
        if(carry == 0)
            return ans;

        while(carry == 1 && l1)
        {

            l1->val += carry;
            if(l1->val > 9)
            {
                l1->val = l1->val %10;
                carry = 1;
                l1 = l1->next;
            }
            else
                return ans;

        }
        if(carry == 1)
        {
            while(ans3->next)
                ans3 = ans3->next;
            ListNode *temp =  new ListNode(1);
            ans3->next = temp;
        }
         
        return ans;
    }
int main()
{
    ListNode *l1 = new ListNode(2);
    ListNode *n1 = new ListNode(4);
    ListNode *n5 = new ListNode(4); 

    ListNode *l2 = new ListNode(5);
    ListNode *n4 = new ListNode(6);
    ListNode *n6 = new ListNode(4);
    //ListNode *n8 = new ListNode(8);
    l1->next = n1;
    n1->next = n5;
    l2->next = n4;
    n4->next = n6;
    //n6->next = n8;
    Solution myS;
    ListNode *temp = myS.addTwoNumbers(l2,l1);
    return 0;
}

囧,读复杂了,还做了个链表的翻转。

ListNode *reverse(ListNode * l2)
    {
        ListNode *n1,*n2,*before;
        n1 = l2;
        n2 = n1->next;
        before = NULL;
        while(n2)
        {
            n1->next = before;
            before = n1;
            n1 = n2;
            n2 = n2->next;
        }
        n1->next = before;
        return n1;
    }

三个指针做链表的反转。

原文地址:https://www.cnblogs.com/qingcheng/p/3512763.html