LeetCode Algorithm 02_Add Two Numbers

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

Tags:Linked List, Math

 

分析:逐位相加,考虑进位。

 

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 class Solution {
10 public:
11     ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) {
12         if (!l1 || !l2) {
13             return NULL;
14         }
15         int carry = 0;  //进位
16         ListNode * result = new ListNode(0);
17         ListNode * first = result;  //追踪结果链表的当前节点
18         ListNode * pre = NULL;  //追踪结果链表的前一个节点
19         //当l1和l2均没有超过链表末尾节点时
20         while (l1 && l2) {
21             first->val = (carry + l1->val + l2->val) % 10;
22             carry = (carry + l1->val + l2->val) / 10;
23             if (pre == NULL)
24                 pre = first;
25             else {
26                 pre->next = first;
27                 pre = first;
28             }
29             first = new ListNode(0);
30             l1 = l1->next;
31             l2 = l2->next;
32         }
33         //当l1和l2都超过链表末尾节点时
34         if (!l1 && !l2) {
35             if (carry == 1) {
36                 first->val = carry;
37                 pre->next = first;
38             }
39             return result;
40         }
41         //当l1超过末尾而l2尚未超过时
42         if (!l1 && l2) {
43             while (l2) {
44                 first->val = (carry + l2->val) % 10;
45                 carry = (carry + l2->val) / 10;
46                 if (pre == NULL)
47                     pre = first;
48                 else {
49                     pre->next = first;
50                     pre = first;
51                 }
52                 first = new ListNode(0);
53                 l2 = l2->next;
54             }
55             if (carry == 1) {
56                 first->val = 1;
57                 pre->next = first;
58             }
59             return result;
60         }
61         //当l2超过末尾而l1尚未超过时
62         if (!l2 && l1) {
63             while (l1) {
64                 first->val = (carry + l1->val) % 10;
65                 carry = (carry + l1->val) / 10;
66                 if (pre == NULL)
67                     pre = first;
68                 else {
69                     pre->next = first;
70                     pre = first;
71                 }
72                 first = new ListNode(0);
73                 l1 = l1->next;
74             }
75             if (carry == 1) {
76                 first->val = 1;
77                 pre->next = first;
78             }
79             return result;
80         }
81 
82     }
83 };

 

posted @ 2015-03-21 18:24  CHEN0958  阅读(112)  评论(0编辑  收藏  举报