Leetcode-2 两数相加

2.两数相加

题目说明
给出两个 非空 的链表用来表示两个非负的整数,其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除数字0之外,这两个数都不会以0开头。
示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 
输出:7 -> 0 -> 8 
原因:342 + 465 = 807

函数形式:

/**
 * 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) {


      }
}

开始的思路:
同时遍历两个链表,获取两个链表对应结点的值val,取和后作为要返回的新的链表的对应结点的val,要注意的是,val要判断是否超过了10,假如超过了10要进行进位。当发现两个链表指向都为空的时候,结束遍历,返回新的链表。

思路中的错误:
1.首先既然val要判断是否超过了10,可以发生进位,那么在进行计算的时候应该将两个链表的值和count进位的值的和作为新的链表的对应的val。
2.其次,当发现两个链表皆为空时结束循环也是错误的,因为假如存在进位'count = 1',那么结束循环,这个count直接不存在的了,所以还要判断count的值是否为0,来作为遍历结束的标志。
3.(这点谈不上是错误,像是不知道的总结)首先是关于结构体的定义,可以这样写ListNode *head = new ListNode(-1),同样的,定义变量也可以是int a(0),这些是我以前是不知道的。
4.还有在提交的时候,给出了这样一个例子

输入:0,0
输出: 0  

虽然题目写着两个链表都不以0开头,但是还是给出这样的一个例子,为了得到正确的结果,所以我将while结束的判定条件移到了开始的部分,不再检测p -> next是否为NULL,而是检测p是否为NULL。

提交代码:

/**
 * 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 *p,*q,*g;
        ListNode *l3 = new ListNode(-1);
        p =  l1;
        q =  l2;
        g =  l3;
        int num1, num2;
        num1 = num2 = 0;
        int sum = 0;
        int count = 0;
        bool flag = true;
        while(flag){

              if(p == NULL && q == NULL){
                if(count == 0){
                    flag = false;
                    break;
                }
            }

            if(p != NULL){
                num1 = p -> val;
                p = p -> next;
            }

            if(q != NULL){
                num2 = q -> val;
                q = q -> next;
            }

            if((num1 + num2 + count) < 10){
                sum = num1 + num2 + count;
                count = 0;
            }
            else{
                sum = num1 + num2 + count- 10;
                count = 1;
            }
            num1 = num2 = 0;
            g -> next = new ListNode(sum);
            g = g -> next;
        }
        g -> next = NULL;
        return l3->next;
    }
};

还有一种思路是让两个链表长度保持一致,较短的那一个进行补零的操作,明天我看明白了再补上。

whitor0428于2020/07/28

喜欢可以点赞
欢迎评论

原文地址:https://www.cnblogs.com/whitor/p/Leetcode-sum_of_two_num.html