[leetcode]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

分析

题目给出两个单链表表示两个非负数,每个节点只能装一个数字(0-9)并且这些数字倒序排放,即是说,比如一个数为871,链表的存储就是1->7->8。现在让你把这两个数加起来,并且同样用链表的方式存储。

有以下的几个情况需要考虑:

1.L1、L2有一个或两个为空,直接返回;

2.L1, L2长度不一样,要注意长出来的部分;

3.注意进位,最高位有可能有进位,需要多分配一个节点存储这个进位。

知识点

1.单链表的遍历;

2.单链表的建立和初始化。

代码

/**
 * 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 *p1 = l1, *p2 = l2;  // p1, p2分别指向l1, l2
    ListNode *pNode = NULL, *pNext = NULL, *start = NULL;   //pNode为新分配的节点,pNext用来遍历链表,start指向链表的开头
    int jinWei = 0;  // 两个节点的值加起来若大于10, 则进位为1
    if( l1 == NULL ) return l2;
    if( l2 == NULL ) return l1;
    while(p1!=NULL && p2!=NULL){  //当两个链表里都有值
        pNode = new ListNode(p1->val + p2->val + jinWei);
        jinWei = pNode->val / 10;
        pNode->val = pNode->val % 10;
        if(start == NULL){
            start = pNode;
            pNext = pNode;
        }
        else{
            pNext->next = pNode;
            pNext = pNext->next;
        }
        p1 = p1->next;
        p2 = p2->next;
    }
    while(p1 != NULL){ // p1里面还有值
        pNode = new ListNode(p1->val + jinWei);
        jinWei = pNode->val / 10;
        pNode->val = pNode->val % 10;
        pNext->next = pNode;
        pNext = pNext->next;
        p1 = p1->next;
    }

    while(p2 != NULL){ // p2里面还有值
        pNode = new ListNode(p2->val + jinWei);
        jinWei = pNode->val / 10;
        pNode->val = pNode->val % 10;
        pNext->next = pNode;
        pNext = pNext->next;
        p2 = p2->next;
    }

    if( jinWei > 0 ){
        pNode = new ListNode(jinWei);
        pNext->next = pNode;

    }

    return start;
        
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值