Lintcode Add Two Numbers II

来源:互联网 发布:java web毕业论文 编辑:程序博客网 时间:2024/06/07 01:04

Example

Given 6->1->7 + 2->9->5. That is, 617 + 295.

Return 9->1->2. That is, 912.

/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public:     /**     * @param l1: the first list     * @param l2: the second list     * @return: the sum list of l1 and l2     */     void ListReverse(ListNode*& list)  //List Reverse     {         if (list == NULL || list->next == NULL)  //特殊情况             return;         ListNode* prev = list, *p = list->next, *pnext = p->next; // 记录三个节点的位置         prev->next = NULL;         while (p != NULL)         {             pnext = p->next;  //记录下一位置             p->next = prev;  //指针前指             prev = p;              p = pnext; // 下一位置继续循环         }         list = prev; // 首节点为原来的尾节点     }     ListNode* Add(ListNode* l1, ListNode* l2)     {         ListNode* sum = NULL, *p1 = NULL, *pf = sum;         // 先把所有的对应位置都进行相加 保存到sum 中         while (l1 != NULL && l2 != NULL)         {             if (sum == NULL)             {                 sum = new ListNode(l1->val + l2->val);                 pf = sum;             }             else             {                 pf->next = new ListNode(l1->val + l2->val);                 pf = pf->next;             }             l1 = l1->next;             l2 = l2->next;         }         while (l1 != NULL)         {             if (sum == NULL) //sum is Null, sum = new listnode             {                 sum = new ListNode(l1->val);                 pf = sum;             }             else             {                 pf->next = new ListNode(l1->val);                 pf = pf->next;             }             l1 = l1->next;         }         while (l2 != NULL)         {             if (sum == NULL)             {                 sum = new ListNode(l2->val);                 pf = sum;             }             else             {                 pf->next = new ListNode(l2->val);                 pf = pf->next;             }             l2 = l2->next;         }         p1 = sum;         bool flag = false;  //进位记录         while (p1 != NULL)         {             if (flag == true)                 p1->val++;             if (p1->val >= 10)             {                 flag = true;                 p1->val -= 10;             }             else                 flag = false;             if (flag == true && p1->next == NULL)             {                 p1->next = new ListNode(1);                 flag = false;             }             p1 = p1->next;         }         return sum;     }     ListNode *addLists2(ListNode *l1, ListNode *l2) {         // write your code here         ListReverse(l1);         ListReverse(l2);         ListNode* out = Add(l1, l2);         ListReverse(out);         return out;     } };
原创粉丝点击