leetcode 2 Add Two Numbers
Add Two Numbers My Submissions QuestionEditorial SolutionYou 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。
所以本尊开始是用比较老实的方法把各位依次相加然后记录进位。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode ListNode ;
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
ListNode* tp1 = l1;
ListNode* tp2 = l2;
ListNode* tp = NULL;
ListNode* tempp = NULL;
ListNode* result = NULL;
int c =0;
if(tp1 == NULL ) return tp2;
else if(tp2 == NULL) return tp1;
while(tp1 || tp2)
{
int temp;
temp =c;
if(tp1) {temp += tp1->val ; tp1 = tp1->next;}
if(tp2) {temp += tp2->val ; tp2 = tp2->next;}
c=0;
c = temp/10;
temp = temp%10;
tp = (ListNode*)malloc(sizeof(ListNode));
tp->val = temp;
tp->next = NULL;
if(!result) {result = tp;tempp = tp;}
else {tempp->next = tp; tempp = tempp->next;}
}
if(c>0)
{
tp = (ListNode*)malloc(sizeof(ListNode));
tp->val = c;
tp->next = NULL;
if(!result) {result = tp;tempp = tp;}
else {tempp->next = tp; tempp = tempp->next;}
}
return result;
}
但是得出的结果很不理想
本尊当然很不开心。
即使有那种很高明的数学方法来让运行时间大幅缩短,但本尊的方法应该也不会落后这么多。最不济也应该是在多数人的那一条。
————对代码削筋剔骨的分割线————————————-
经过对代码的反复审视,本尊发现了一个耗时大户malloc,其实完全没必要在开辟新的空间,直接利用原有的两条链表就可以了。
于是有了以下代码:
typedef struct ListNode ListNode ;
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
ListNode* tp1 = l1;
ListNode* tp2 = l2;
ListNode* tp = NULL;
ListNode* tempp = NULL;
int c =0;
int show =0;
if(tp1 == NULL ) return tp2;
else if(tp2 == NULL) return tp1;
tp = tp1;
while(tp1 || tp2)
{
int temp;
temp =c;
if(tp1) {temp += tp1->val ; tp1 = tp1->next;}
if(tp2) {temp += tp2->val ; tp2 = tp2->next;}
c=0;
if(temp>9)
{//因为进位最多进一,将取余改成减法,缩短时间
c = 1;
temp = temp- 10;
}
tp->val = temp;
if(tp1){tempp=tp;tp =tp1;}
else {tempp=tp;tp->next=tp2;tp =tp2;}
}
if(c>0)
{
tp = (ListNode*)malloc(sizeof(ListNode));
tp->val = c;
tp->next = NULL;
tempp->next = tp ;
}
return l1;
}
结果自然是很开心了