2. Add Two Numbers(Medium)

来源:互联网 发布:诺基亚5800软件下载 编辑:程序博客网 时间:2024/05/29 03:01

原题目:
  You are given two non-empty linked lists representing two non-negative integers. 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.
  You may assume the two numbers do not contain any leading zero, except the number 0 itself.
  Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
  Output: 7 -> 0 -> 8
  
题目大意如下:
  将两个用非空链表逆序表示的数字加起来,每个节点包含十进制数的一个位。最后将答案以链表形式返回。
  
解题思路:
  大致类似于竖式加法的算法,用到了一点归并的思想。测试样例中有需要注意的比如【1】和【9,9】,一定要注意连续的进位。【5,5】,要注意当计算完成时是否依然有进位。
  
代码如下:

/** * 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) {        ListNode* p = l1 ;        ListNode* q = l2 ;        int m = p->val + q->val ;   //m表示进位        int n ;     //n表示当前位对应加起来的结果        ListNode* ans = new ListNode(m%10) ;  //首先单独构造个位结果        ListNode* rear = ans ;        p = p->next ;        q = q->next ;        //如果只有个位相加,计算结束,但需要另外判断是否有进位        if(q == NULL && p == NULL && m/10) rear->next = new ListNode(1) ;        while(p != NULL && q != NULL){            n = p->val + q->val ;            //每一位计算结果=当前结果+进位(0或1),再取余            rear->next = new ListNode((n + m/10)%10) ;            rear = rear->next ;            p = p->next ;            q = q->next ;            m = n + m/10 ; //更新进位            //同样,如果当计算结束的时候还有进位,也要写出来            if(q == NULL && p == NULL && m/10) rear->next = new ListNode(1) ;        }            //当其中有一个数字位数计算完成时            while(p != NULL){                //依然要考虑前面的进位和当计算完成时是否有进位                rear->next = new ListNode((p->val + m/10)%10) ;                rear = rear->next ;                m = p->val + m/10 ;                p = p->next ;                if(p == NULL && m/10) rear->next = new ListNode(1) ;            }            while(q != NULL){                rear->next = new ListNode((q->val + m/10)%10) ;                rear = rear->next ;                m = q->val + m/10 ;                q = q->next ;                if(q == NULL && m/10) rear->next = new ListNode(1) ;            }        return ans ;    }};

运行结果:
运行结果

0 0