码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode 2 Add Two Numbers(链表操作)

时间:2015-12-15 22:49:47      阅读:253      评论:0      收藏:0      [点我收藏+]

标签:

题目来源:https://leetcode.com/problems/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

题目要求:给出两个链表l1和l2,将相对应的元素相加,如果产生进位则保留个位,相应的十位加在后面的对应元素上.

解体思路:

首先判断链表是否为空,若l1空,直接返回l2,相反返回l2

然后找到l1和l2链表最短的一个长度min_len,进入循环

循环过程中,为了减少空间的开销,可以将链表l1作为最终的结果链表,只需要改变l1的最大容量为l1+l2即可,另外相加过程中需要一个整型temp变量来保存进位.

循环结束之后,判断l1或l2空否(之前计算最短链表时可以做标记),然后将不空的链表中其他元素全部放入结果链表中即可.

提交代码:

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 
10 class Solution {
11 public:
12     ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) {
13         // Start typing your C/C++ solution below
14         // DO NOT write int main() function
15 //        ListNode *pResult = NULL;
16 //        ListNode **pCur = &pResult;
17 
18         ListNode rootNode(0);
19         ListNode *pCurNode = &rootNode;
20         int a = 0;
21         while (l1 || l2)
22         {
23             int v1 = (l1 ? l1->val : 0);
24             int v2 = (l2 ? l2->val : 0);
25             int temp = v1 + v2 + a;
26             a = temp / 10;
27             ListNode *pNode = new ListNode((temp % 10));
28             pCurNode->next = pNode;
29             pCurNode = pNode;
30             if (l1)
31                 l1 = l1->next;
32             if (l2)
33                 l2 = l2->next;
34         }
35         if (a > 0)
36         {
37             ListNode *pNode = new ListNode(a);
38             pCurNode->next = pNode;
39         }
40         return rootNode.next;
41     }
42 };

下面给出数组解决的代码,具体过程相同,只是数据存储结构不同:

 1 #include <bits/stdc++.h>
 2 #define MAX 1000010
 3 
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     int n1,n2;
 9     while(~scanf("%d %d",&n1,&n2))
10     {
11         int *a=new int[n1+n2+1];
12         int *b=new int[n2];
13         for(int i=0;i<n1;i++)
14             scanf("%d",&a[i]);
15         for(int i=0;i<n2;i++)
16             scanf("%d",&b[i]);
17         int minlen=min(n1,n2);
18         int maxlen=n1+n2-minlen;
19         int temp=0;
20         for(int i=0;i<minlen;i++)
21         {
22             a[i]=a[i]+b[i]+temp;
23             if(a[i]>=10)
24             {
25                 temp=a[i]/10;
26                 a[i]=a[i]%10;
27             }
28         }
29         for(int j=minlen;j<maxlen;j++)
30         {
31                 if(maxlen==n1)
32                     a[j]=a[j];
33                 else
34                     a[j]=b[j];
35         }
36         for(int i=0;i<maxlen;i++)
37             printf("%d ",a[i]);
38         printf("\n");
39     }
40 }

 

  

LeetCode 2 Add Two Numbers(链表操作)

标签:

原文地址:http://www.cnblogs.com/zpfbuaa/p/5049623.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!