力扣——第2题(C++)

0 阅读2分钟

B站讲的很好的视频:

【从零开始刷力扣学C++——第二题:两数相加】 www.bilibili.com/video/BV1mP…

题目

image.png

image.png

知识点

1.链表

 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;//节点的数据值
 *     ListNode *next;//节点的指针域
        //构造函数
        //无参构造函数,创建一个值为0、后继为空的节点。
 *     ListNode() : val(0), next(nullptr) {}
        //接受一个整数,将节点值设为 x,后继为空。
 *     ListNode(int x) : val(x), next(nullptr) {}
        //接受一个整数和一个 next 指针,初始化节点值和下一个节点。
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */

2.三目运算符

blog.csdn.net/weixin_4425…

题解

 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;//节点的数据值
 *     ListNode *next;//节点的指针域
        //构造函数
        //无参构造函数,创建一个值为0、后继为空的节点。
 *     ListNode() : val(0), next(nullptr) {}
        //接受一个整数,将节点值设为 x,后继为空。
 *     ListNode(int x) : val(x), next(nullptr) {}
        //接受一个整数和一个 next 指针,初始化节点值和下一个节点。
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
 
        ListNode *head = nullptr;//创建head链表存储结果
        ListNode *p = nullptr;//head链表的尾节点
        int carry = 0;//用于进位
 
        while( l1 || l2 ){//当l1和l2都不为空
            int n1 = l1 ? l1->val : 0;
            int n2 = l2 ? l2->val : 0;
            int sum = n1 + n2 + carry;
 
            if(!head){//如果 head 为空,说明结果链表还没有任何节点(即第一次创建节点)。
                head = p = new ListNode( sum%10 );
            }else{//如果 head 不为空,说明链表已有节点。
                p->next = new ListNode( sum%10 );
                p = p->next;
            }
 
            carry = sum/10;
 
            if(l1){//l1不为空则继续下一个数
                l1 = l1->next;
            }
            if(l2){//l2不为空则继续下一个数
                l2 = l2->next;
            }
 
        }//while
 
        //算完了之后,carry大于0则继续进位,head链表新增节点
        if( carry > 0 ){
            p->next = new ListNode(carry);
        }
 
        return head;//返回head链表
    }
};