LeetCode 2.Add Two Numbers

来源:互联网 发布:需要买车吗 知乎 编辑:程序博客网 时间:2024/04/28 06:37

题目:

You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8

分析与解答:

一开始我想直接把两个链表顺序读出来构成数字然后相加,然后发现这个方法没法处理大数,其实这个题目就是解决大数相加的。所以还是采用链表逐节相加的方法。需要注意的是:

1.当某个链表为空的情况,直接返回另一个链表。

2.某两节相加大于10时就需要进位。

3.当两个链表均读取完毕之后,程序并不一定完成,需要判定最高位是否产生了进位,这个地方我一开始没想到,导致了WA。

/** * Add two numbers * by rickard * 2015.1.21 * 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) {    //对空链表的判断    if((l1 == NULL) && (l2 == NULL)) return NULL;    if(l1 == NULL)return l2;    if(l2 == NULL)return l1;    struct ListNode *temp1 = l1,*temp2 = l2;    //头指针head和指向头指针的指针p    struct ListNode headNode(0),*p=&headNode;    int flag = 0;//进位符    int nodeVal = 0;    while(!(temp1 == NULL && temp2 == NULL && flag == 0))    {        //如果其中一个链表到尾了,就把另一个链表的后部整体复制给result        if(temp1 == NULL && temp2 != NULL)        {            nodeVal = temp2 -> val + flag;            temp2 = temp2->next;        }        else if(temp2 == NULL && temp1 != NULL)        {            nodeVal = temp1 -> val + flag;            temp1 = temp1->next;        }        else if(temp1 == NULL && temp2 ==NULL && flag)        {            nodeVal = flag;            flag = 0;        }        else        {            nodeVal = temp1->val + temp2->val + flag;            temp1 = temp1 -> next;            temp2 = temp2 -> next;        }        p -> next = new ListNode(0);        if(nodeVal < 10)        {            p->next->val = nodeVal;            flag = 0;        }        else        {            p->next->val  = nodeVal%10;            flag = 1;        }        p = p->next;    }        return headNode.next;    }};


程序并不精简,网上看到国外一个人写的代码,只有11行,非常简练。

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



0 0
原创粉丝点击