leetcode之两数相加C++解法

leetcode之两数相加C++解法 【leetcode之两数相加C++解法】给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:

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

伪代码:
  • 将当前结点初始化为返回列表的哑结点。
  • 将进位 carry 初始化为 00。
  • 将 p 和 q 分别初始化为列表 l1和 l2的头部。
  • 遍历列表 l1 和 l2 直至到达它们的尾端。
    • 将 x 设为结点 p 的值。如果 p 已经到达 l1 的末尾,则将其值设置为 0。
    • 将 y 设为结点 q 的值。如果 q 已经到达 l2 的末尾,则将其值设置为 0。
    • 设定 sum = x + y + carry。
    • 更新进位的值,carry = sum / 10。
    • 创建一个数值为 (sum mod 10)的新结点,并将其设置为当前结点的下一个结点,然后将当前结点前进到下一个结点。
    • 同时,将 p 和 q 前进到下一个结点。
  • 检查 carry = 1是否成立,如果成立,则向返回列表追加一个含有数字 1 的新结点。
  • 返回哑结点的下一个结点。
代码:
/** * 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 *head = new ListNode(0); ListNode *curr = head; ListNode *p = l1; ListNode *q = l2; int carry = 0; while(p || q){ int x = p?p->val:0; int y = q?q->val:0; int sum = x+y+carry; //以上三行也可以写成一行: int sum = (p?p->val:0)+ (q?q->val:0)+ carry;但是程序执行速度会降低 carry = sum/10; curr->next = new ListNode(sum%10); curr=curr->next; if(p) p=p->next; if(q) q=q->next; } if(carry>0) //最高位的进位,这一处容易被忽略 curr->next = new ListNode(1); return head->next; } };

    推荐阅读