【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

我的解题思路:
数据结构已经好久没碰过了,拿到这道题目,我一开始的想法居然是首先由链表生成两个int型的整数, 然后把他们加起来再生成一个新的链表。这种办法显然无法适用于特别大的整数,这时候用于存储整数的int变量会溢出。第一次提交没有通过之后,再仔细想想,才发现这道题考的是链表的操作问题,应当利用链表的指针来按位相加。最后写出的程序如下:

/**
 * 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) {
      int flag=0;
      ListNode * l1_st=l1;
      ListNode * l2_st = l2;
      ListNode * end;
      ListNode * res_node=NULL;
      ListNode * curr_node=NULL;
      while((l1!=NULL)&&(l2!=NULL))/*两个链表都没结束*/
      {
          int sum = l1->val + l2->val+flag;
            if(sum>=10)
            {
                sum = sum-10;
                flag=1;
            }
            else
                flag=0;
          l1->val = sum;
          l2->val = sum;
           end=l1;
          l1=l1->next;
          l2=l2->next;

      }

        res_node = l1_st;
        curr_node = l1;
        /*两个链表都结束了,但是还有进位*/
     if(l1==NULL&&l2==NULL&&flag==1)
     {
          ListNode * tmp = new ListNode(1);
          end->next = tmp;
          tmp->next=NULL;
          return res_node;
     }
      if(l1==NULL&&l2==NULL&&flag==0)
     {

          return res_node;
     }
     /*l1结束,但是l2没有结束*/
      if((l1==NULL)&&(l2!=NULL))
      {
            curr_node=l2;
            res_node = l2_st;

      }

         while((curr_node!=NULL))
      {
          int sum = curr_node->val +flag;

            if(sum>=10)
            {
                sum = sum-10;
                flag=1;
            }
            else
                flag=0;

          curr_node->val = sum;
          end=curr_node;
          curr_node=curr_node->next;
      }

      if(flag==1&&curr_node==NULL)
      {
          ListNode * tmp = new ListNode(1);
          end->next = tmp;
          tmp->next=NULL;

      }
      return res_node;
    }
};

这套题的难点在于要考虑多种情况,比如12+98,会引起进位从而得到3位数的结果110等等,需要在程序里面充分考虑这些情况。

编写程序的时候在结构体的初始化上面
ListNode * tmp = new ListNode(1);
还折腾了一小段时间,C++的结构体不同于一般C语言的结构体,还可以有构造函数,这是之前的一个知识盲点,以后要记住了。

关于链表的问题实质上就是操作指针的问题,在VS中输入测试的链表不大方便,可以在纸上画出来链表然后进行纸上Debug。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值