LeetCode 445. 两数相加 II

题目:给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。你可以假设除了数字 0 之外,这两个数字都不会以零开头。进阶:如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。示例:输入: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)输出...
摘要由CSDN通过智能技术生成
  • 题目:
    给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。

你可以假设除了数字 0 之外,这两个数字都不会以零开头。

进阶:

如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。

示例:

输入: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
输出: 7 -> 8 -> 0 -> 7

  • 解题思路
    1:反转链表,就变成了反转链表1的解法 :
    代码实现(C++)
ListNode* rev(ListNode* head)                    //反转链表
    {
        if(head == nullptr || head->next == nullptr)
            return head;
        ListNode* newhead = rev(head->next);
        head->next->next = head;
        head->next = nullptr;
        return newhead; 
    }
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode* newhead1 = rev(l1);                //反转链表l1
        ListNode* newhead2 = rev(l2);                //反转链表l2
        int tag = 0;                                 //进位标志
        ListNode *p = newhead1->next, *q = newhead2->next;
       // cout << p->val;
        //cout << q->val;
        ListNode *newhead3 = new ListNode(0);
        newhead3->val = (newhead1->val + newhead2->val) % 10;
        tag = (newhead1->val + newhead2->val) / 10;
        ListNode *L = newhead3;
        while(p != nullptr && q != nullptr)
        {
            ListNode *newNode = new ListNode(0);
            L->next = newNode;
            newNode->val = (p->val + q->val + tag) % 10;
            tag = (p->val + q->val + tag) / 10;
            p = p->next;
            q = q->next;
            L = newNode;
        }
        while(p)
        {
            ListNode* l3 = new ListNode(0);
            L->next = l3;
            L = l3;
             if (p->val + tag < 10)
                {
                   L->val = p->val + tag;
                   tag = 0;
                }
            else
                {
                   L->val = 0;
                   tag = 1;
                }
             p = p->next;
        } 
        while(q)
        {
            ListNode* l3 = new ListNode(0);
            L->next = l3;
            L = l3;
             if (q->val + tag < 10)
                {
                   L->val = q->val + tag;
                   tag = 0;
                }
            else
                {
                   L->val = 0;
                   tag = 1;
                }
             q = q->next;
        } 
         if(tag != 0)
        {
            ListNode *L4 = new ListNode(0);
                L4->val = 1;
                L->next = L4;
                tag = 0;
        }
        
       ListNode* newhead4 = rev(newhead3);
       return newhead4;
    }

2:可以利用栈来进行链表反转,而不用修改链表

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值