zoukankan      html  css  js  c++  java
  • 2. Add Two Numbers

    You are given two non-empty linked lists representing two non-negative integers. 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.

    You may assume the two numbers do not contain any leading zero, except the number 0 itself.

    第一次尝试代码:

     1 #include<iostream>
     2 #define NULL 0 
     3 using namespace std;
     4 struct ListNode {
     5      int val;
     6      ListNode *next;
     7      ListNode(int x) : val(x), next(NULL) {}
     8  };
     9 
    10 class Solution {
    11 public:
    12     ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    13         ListNode *ans = new ListNode(0);
    14         ListNode *p = l1;
    15         ListNode *q = l2;
    16         ListNode *temp = new ListNode(0);
    17         int a = 0;
    18         while (p ->next!= NULL&&q->next != NULL) {
    19             if (p->val + q->val >= 10) {
    20                 ans->val = p->val + q->val - 10 + a;
    21                 a = 1;
    22             }
    23             else {
    24                 ans->val = p->val + q->val + a;
    25                 a = 0;
    26             }
    27             ans = ans->next;
    28             p = p->next;
    29             q = q->next;
    30         }
    31         if (p->next == NULL) {
    32             ListNode *temp = q;
    33         }
    34         else {
    35             ListNode *temp = p;
    36         }
    37         while(temp->next != NULL) {
    38             ans->val = temp->val+a;
    39         }
    40         return ans;
    41     }
    42     
    43 };
    44 
    45 int main() {
    46     Solution my;
    47     ListNode *l1=new ListNode(2);
    48     l1->next->val = 4;
    49     l1->next->next->val = 3;
    50 
    51     ListNode *l2 = new ListNode(5);
    52     l2->next->val = 6;
    53     l2->next->next->val = 6;
    54 
    55     ListNode* ans = my.addTwoNumbers(l1, l2);
    56     while (ans->next != NULL) {
    57         cout << ans->val << endl;
    58         ans = ans->next;
    59     }
    60     return 0;
    61 }

    错误点:

    1.我在这里直接用ans = ans->next,但是事实上一开始初始化的时候ans->next是指向NULL的,所以这里会报错。需要用ans->next = new ListNode(answer);

    2.函数体最后直接return ans是不对的,因为这时候ans代表的结构体是,val=8;next->NULL。所以最后答案只会打印出一个数字。需要用到另一个结构体flag,一开始对其进行赋值,令ans=flag,让flag记录一下最开始的地址,最后令ans=flag->next即可。

    第二次尝试代码:

     1 #include<iostream>
     2 #define NULL 0 
     3 using namespace std;
     4 struct ListNode {
     5      int val;
     6      ListNode *next;
     7      ListNode(int x) : val(x), next(NULL) {}
     8  };
     9 
    10 class Solution {
    11 public:
    12     ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    13         ListNode* flag = new ListNode(0);
    14 
    15         ListNode* ans = flag;
    16 
    17         ListNode *p = l1;
    18         ListNode *q = l2;
    19         ListNode *temp = new ListNode(0);
    20 
    21         int a = 0;
    22         int answer = 0;
    23 
    24         while (p != NULL&&q != NULL) {
    25 
    26             if (p->val + q->val + a >= 10) {
    27                 answer = p->val + q->val - 10 + a;
    28             
    29                 ans->next = new ListNode(answer);
    30                 
    31                 a = 1;
    32             }
    33             else {
    34                 answer = p->val + q->val + a;
    35 
    36                 ans->next = new ListNode(answer);
    37 
    38                 a = 0;
    39             }
    40             p = p->next;
    41             q = q->next;
    42         }
    43         if (p == NULL&&q != NULL) {
    44             ListNode *temp = q;
    45         }
    46         if(q == NULL&&p != NULL){
    47             ListNode *temp = p;
    48         }
    49         else{ 
    50             if (a == 1) {
    51                 ans->next = new ListNode(1);
    52             }
    53             cout << "return" << endl;
    54             cout << "flag->next " << flag->next->val << endl;
    55             ans = flag->next;
    56             cout << "ans " << ans->val << endl;
    57             delete flag;
    58             return ans;
    59         }
    60 
    61         
    62 
    63         while(temp->next != NULL) {
    64             answer = temp->val + a;
    65             ans->next = new ListNode(answer);
    66         }
    67         cout << "here" << endl;
    68         ans = flag->next;
    69         delete flag;
    70         return ans;
    71     }
    72 };
    73 
    74 int main() {
    75     Solution my;
    76     ListNode *l1=new ListNode(2);
    77     l1->next = new ListNode(4);
    78     l1->next->next = new ListNode(3);
    79     cout << "l1 " << l1->val << endl;
    80 
    81 
    82     ListNode *l2 = new ListNode(5);
    83     l2->next = new ListNode(6);
    84     l2->next->next = new ListNode(4);
    85     cout << "l2 " << l2->val << endl;
    86 
    87     cout << "main" << endl;
    88     ListNode* ans = my.addTwoNumbers(l1, l2);
    89     while (ans != NULL) {
    90         cout << "答案" << endl;
    91         cout << ans->val << endl;
    92         ans = ans->next;
    93     }
    94     return 0;
    95 }

    错误点:

    这里有一个指针含义的误区。在一开始ListNode* ans = flag这个赋值语句时,ans和flag其实就是一个东西,val=0;next->NULL。就相当于一个房间的两个钥匙,当ans->next = new ListNode(answer)后,这个房间中的东西发生变化,val=0;next->一个确切的地址。这时候ans和flag还是同一个东西。当ans=ans->next后,ans发生变化,但是flag还是没有变化,即flag->next指向的是题目中7这个数所在的结点,是链表的开始。所以最后ans=flag->next可以找回整条链表。

    而这里的错误点是在每次计算时没有令ans=ans->next,使得每次改变的数都是ans->next,所以最后只能打印出一个一个值。

    第三次尝试代码:

    #include<iostream>
    #define NULL 0 
    using namespace std;
    struct ListNode {
         int val;
         ListNode *next;
         ListNode(int x) : val(x), next(NULL) {}
     };
    
    class Solution {
    public:
    	ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    		ListNode* flag = new ListNode(0);
    		ListNode* ans = flag;
    		ListNode *p = l1;
    		ListNode *q = l2;
    		ListNode *temp = new ListNode(0);
    		int a = 0;
    		int answer = 0;
    		while (p != NULL&&q != NULL) {
    			if (p->val + q->val + a >= 10) {
    				answer = p->val + q->val - 10 + a;
    				ans->next = new ListNode(answer);
    				a = 1;
    			}
    			else {
    				answer = p->val + q->val + a;
    				ans->next = new ListNode(answer);
    				a = 0;
    			}
    			p = p->next;
    			q = q->next;
    			ans = ans->next;
    		}
    		if (p == NULL&&q != NULL) {
    			ListNode *temp = q;
    		}
    		if(q == NULL&&p != NULL){
    			ListNode *temp = p;
    		}
    		else{ 
    			if (a == 1) {
    				ans->next = new ListNode(1);
    			}
    			cout << "return" << endl;
    			cout << "flag " << flag->val << endl;
    			cout << "flag->next " << flag->next->val << endl;
    			//cout << "flag->next->next " << flag->next->next->val << endl;
    			ans = flag->next;
    			cout << "ans " << ans->val << endl;
    			//cout << "ans->next " << ans->next->val << endl;
    			delete flag;
    			cout << "ans2 " << ans->val << endl;
    			return ans;
    		}
    		while(temp->next != NULL) {
    			answer = temp->val + a;
    			ans->next = new ListNode(answer);
    		}
    		cout << "here" << endl;
    		ans = flag->next;
    		delete flag;
    		return ans;
    	}
    };
    
    int main() {
    	Solution my;
    	ListNode *l1=new ListNode(2);
    	l1->next = new ListNode(4);
    	l1->next->next = new ListNode(3);
    	cout << "l1 " << l1->val << endl;
    
    	ListNode *l2 = new ListNode(5);
    	l2->next = new ListNode(6);
    	l2->next->next = new ListNode(4);
    	cout << "l2 " << l2->next->next->val << endl;
    
    	cout << "main" << endl;
    	ListNode* ans = my.addTwoNumbers(l1, l2);
    	while (ans != NULL) {
    		cout << "答案" << endl;
    		cout << ans->val << endl;
    		ans = ans->next;
    	}
    	return 0;
    }
    

    错误点:

    1.当输入【1,8】和【0】时返回的应该是【1,8】,但这个函数返回的却是【1】,不符合规定。

    2.当输入【9,9】和【1】时返回的应该是【1,0,0】,不符合规定。

    第四次尝试代码:

      1 #include<iostream>
      2 #define NULL 0 
      3 using namespace std;
      4 struct ListNode {
      5      int val;
      6      ListNode *next;
      7      ListNode(int x) : val(x), next(NULL) {}
      8  };
      9 
     10 class Solution {
     11 public:
     12     ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
     13         ListNode* ans = new ListNode(0);
     14         ListNode* flag = ans;
     15         ListNode *p = l1;
     16         ListNode *q = l2;
     17         ListNode *temp = new ListNode(0);
     18         int a = 0;
     19         int answer = 0;
     20         while (p != NULL&&q != NULL) {
     21             if (p->val + q->val + a >= 10) {
     22                 answer = p->val + q->val - 10 + a;
     23                 ans->next = new ListNode(answer);
     24                 a = 1;
     25             }
     26             else {
     27                 answer = p->val + q->val + a;
     28                 ans->next = new ListNode(answer);
     29                 a = 0;
     30             }
     31             p = p->next;
     32             q = q->next;
     33             ans = ans->next;
     34         }
     35         if (p == NULL&&q != NULL) {
     36             temp = q;
     37             cout << "aaaa" << endl;
     38             cout << "1,8:" << endl;
     39             cout << "q: " << q->val << endl;
     40         }
     41         else if (q == NULL&&p != NULL){
     42             temp = p;
     43             cout << "0:" << endl;
     44             cout << "p: " << temp->val<< endl;
     45         }
     46         else {
     47             if (a == 1) {
     48                 ans->next = new ListNode(1);
     49             }
     50             cout << "return" << endl;
     51             ans = flag->next;
     52             delete flag;
     53             return ans;
     54         }
     55         while(temp != NULL) {
     56             cout << "temp->val: " << temp->val << endl;
     57             if (temp->val + a >= 10) {
     58                 answer = temp->val -10 + a;
     59                 ans->next = new ListNode(answer);
     60                 a = 1;
     61             }
     62             else {
     63                 answer = temp->val + a;
     64                 ans->next = new ListNode(answer);
     65                 a = 0;
     66             }
     67             ans = ans->next;
     68             temp = temp->next;
     69         }
     70         if (a == 1) {
     71             ans->next = new ListNode(1);
     72         }
     73         cout << "here" << endl;
     74 
     75         ans = flag->next;
     76 
     77         delete flag;
     78 
     79         return ans;
     80     }
     81 };
     82 
     83 int main() {
     84     Solution my;
     85     ListNode *l1=new ListNode(9);
     86     l1->next = new ListNode(9);
     87 
     88     cout << "l1 " << l1->next->val << endl;
     89 
     90     ListNode *l2 = new ListNode(1);
     91     cout << "l2 " << l2->val << endl;
     92 
     93     cout << "main" << endl;
     94     ListNode* ans = my.addTwoNumbers(l1, l2);
     95     while (ans != NULL) {
     96         cout << "答案" << endl;
     97         cout << ans->val << endl;
     98         ans = ans->next;
     99     }
    100     return 0;
    101 }

    笔记:

    1.对于链表,新增加一个结点时的操作l->next=new ListNode(1)

    2.计算结束后指针会指向链表结尾,这时候需要在初始化时就创建一个结点保存链表初始位置

    3.就对这道题而言,不同位数相加,最后进位需要注意,如99+1

  • 相关阅读:
    2020软件工程个人作业06————软件工程实践总结作业
    2020软件工程作业01
    班级博客V2.1版本更新日志
    博客园班级手机版
    班级帮助文档
    问题累计
    2020 软件工程作业06
    2020 软件工程作业04
    2020 软件工程作业03
    2020软件工程02
  • 原文地址:https://www.cnblogs.com/yuanninesuns/p/8433216.html
Copyright © 2011-2022 走看看