您的位置:首页 > 其它

LeetCode题解——Add Two Numbers

2014-06-02 09:49 375 查看
题目

两个数字求和,数字用链表表示,每一个结点代表一位。链表顺序与数字顺序相反,即表头存放数字的最低位。

解法

分别遍历两个链表的每个结点,对两个结点求和即可。要维护一个变量保存每次相加之后的进位。

更常见的,链表顺序与数字顺序相同,那么做一次链表逆序,求和之后再逆序回来即可。

代码

/**
* 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 retHead(-1), *pr = &retHead, *p1 = NULL, *p2 = NULL;
int carry = 0;  //保存每次结点求和之后的进位,用一个bool也可以

for(p1 = l1, p2 = l2; p1 != NULL && p2 != NULL; p1 = p1->next, p2 = p2->next)   //p1 p2分别遍历两个链表
{
int sum  = p1->val + p2->val + carry;
pr->next = new ListNode(sum % 10);  //求和结果保存在新结点

pr    = pr->next;    //p2指向求和链表的尾结点
carry = sum / 10;
}

for(ListNode *p = (p1 == NULL ? p2 : p1); p != NULL; p = p->next)   //处理两个链表中未处理完的链表剩余节点
{
int sum  = p->val + carry;
pr->next = new ListNode(sum % 10);

pr    = pr->next;
carry = sum / 10;
}

if(carry != 0)  //如果最后还有进位,必定是1
{
pr->next = new ListNode(carry);
}

return retHead.next;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: