[LeetCode] 2. Add Two Numbers

来源:互联网 发布:json数组增加元素 编辑:程序博客网 时间:2024/06/06 10:45

2. Add Two Numbers (两数相加)


  • Add Two Numbers 两数相加
    • 题目翻译
    • 解题方法
    • 代码


1. 题目翻译

给定两个非空单链表代表两个非负整数。每个结点有一位数字,以倒序保存在链表中。将两数相加,并返回一个代表结果的链表。假设两个数字不含无效的0(即数字不以0开头),0本身除外。

例子:

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

2. 解题方法

遍历两个链表把每一位上的数字相加,并用变量记录是否需要进位,该变量初始为0。因为两个数字位数可能不同,所以有四种情况

  1. 两个链表中都有这一位数字,且两数与进位变量相加小于10,则直接得到新结点,并且将进位变量置位0.
  2. 两个链表中都有这一位数字,但两数与进位变量相加大于等于10,新结点的值为得到的和减10,并且将进位变量置位1.
  3. 只有一个链表有这一位数字,且这个数字加进位量小于10,直接得到新结点,变位量置位0.
  4. 只有一个链表有这一位数字,且这个数字加进位量大于等于10,新结点的值为得到的和减10,并且将进位变量置位1.

需要考虑到,最后可能两个链表相加完成后,进位量为1,要把这一进位量加到数字前面。

3. 代码

//Runtime: 45msclass Solution {public:    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {        ListNode* p=l1;        ListNode* q=l2;        ListNode* head = new ListNode(0);        head->next = NULL;        ListNode* tail = head;        int temp = 0;        while(p&&q){            ListNode* m = new ListNode(p->val+q->val+temp);            if(p->val+q->val+temp<10){                temp = 0;            }else{                m->val -= 10;                temp = 1;            }            tail->next = m;            tail = m;            p = p->next;            q = q->next;        }        while(p){            ListNode* m = new ListNode(p->val+temp);            if(p->val+temp<10){                temp = 0;            }else{                m->val -= 10;                temp = 1;            }            tail->next = m;            tail = m;            p = p->next;        }        while(q){            ListNode* m = new ListNode(q->val+temp);            if(q->val+temp<10){                temp = 0;            }else{                m->val -= 10;                temp = 1;            }            tail->next = m;            tail = m;            q = q->next;        }        if(temp){            ListNode* m = new ListNode(temp);            tail->next = m;            tail = m;        }        tail->next = NULL;        return head->next;    }};
原创粉丝点击