LintCode链表求和221

来源:互联网 发布:关于sql查询的实训报告 编辑:程序博客网 时间:2024/05/16 15:06

221.假定用一个链表表示两个数,其中每个节点仅包含一个数字。假设这两个数的数字顺序排列,请设计一种方法将两个数相加,并将其结果表现为链表的形式。
对于这道题,可以先把两个链表翻转,再依次相加,再把相加的结果再次翻转。

/** * 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.     */    ListNode * addLists2(ListNode * l1, ListNode * l2) {        if(!l1&&!l2)            return NULL;        ListNode *head = new ListNode;        ListNode *tail = head;        ListNode *p1 = reverse(l1);//翻转链表l1        ListNode *p2 = reverse(l2);//翻转链表l2        head->next = NULL;        int val1,val2;        int flag = 0;        while(p1||p2)//翻转后的链表元素依次相加        {            if(p1)            {                val1 = p1->val;                p1 = p1->next;            }            else                val1 = 0;            if(p2)            {                val2 = p2->val;                p2 = p2->next;            }            else                val2 = 0;            int temp = flag+val1+val2;            flag = temp/10;            temp = temp%10;            ListNode *pTest = new ListNode;            pTest->val = temp;            pTest->next = NULL;            tail->next = pTest;            tail = tail->next;        }        if(flag)        {            ListNode *pTest = new ListNode;            pTest->val = flag;            pTest->next = NULL;            tail->next = pTest;        }        tail = head;        head = head->next;        delete tail;        return reverse(head);//翻转计算结果    }    ListNode * reverse(ListNode *head)//翻转链表    {        ListNode *p = new ListNode;        ListNode *temp = NULL;        p->next = NULL;        temp = head;        head = p;        p = temp;        while(p)        {            temp = p;            p = p->next;            temp->next = head->next;            head->next = temp;        }        temp = head;        head = head->next;        return head;    }};