Problem: 2. 兩數(shù)相加
思路
主要是一一相加和逆序的方式存儲
先說逆序儲存,看下圖
我們先聲明出指針p和指針q,還有指針head(主要用于return上而已),然后進(jìn)行一系列操作,之后,p = q,之后的操作就是對q進(jìn)行,至于p,只做一個動作,p = q
int flag = 0;
struct ListNode *p = NULL, *q = NULL, *head = NULL;
while(l1 != NULL && l2 != NULL) {
if(flag == 0) {
flag = 1;
p = (struct ListNode*)malloc(sizeof(struct ListNode));
p->next = NULL;
head = p;
} else {
q = (struct ListNode*)malloc(sizeof(struct ListNode));
q->next = NULL;
p->next = q;
p = q;
}
l1 = l1->next;
l2 = l2->next;
}
至于相加嘛!好說,將對應(yīng)的兩個數(shù)加起來,然后檢查是否大于9,如果是,則要保留個位,并進(jìn)一位(也就是將十位數(shù)的部分放入下一個相加的過程中),以指針p的部分為例——指針q的部分也一樣。
p->val = l1->val + l2->val;
if(p->val > 9) {
last = p->val / 10;
p->val %= 10;
} else last = 0;
但是,要知道,l1與l2終會到達(dá)null,所以,對于剩余的部分也只是解決前面的“進(jìn)一位”遺留的問題而已.
while(l1 != NULL) {
q = (struct ListNode*)malloc(sizeof(struct ListNode));
q->val = l1->val + last;
if(q->val > 9) {
last = q->val / 10;
q->val %= 10;
} else last = 0;
q->next =NULL;
p->next = q;
p = q;
l1 = l1->next;
}
while(l2 != NULL) {
q = (struct ListNode*)malloc(sizeof(struct ListNode));
q->val = l2->val + last;
if(q->val > 9) {
last = q->val / 10;
q->val %= 10;
} else last = 0;
q->next =NULL;
p->next = q;
p = q;
l2 = l2->next;
}
到最后,倘若還存在進(jìn)一位,就得要再建一個節(jié)點(diǎn)。
if(last > 0) {
q = (struct ListNode*)malloc(sizeof(struct ListNode));
q->val = last;
if(q->val > 9) {
last = q->val / 10;
q->val %= 10;
} else last = 0;
q->next =NULL;
p->next = q;
p = q;
}
解題方法
由思路可知
Code
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
struct ListNode *p = NULL, *q = NULL, *head = NULL;
int flag = 0, last;
while(l1 != NULL && l2 != NULL) {
if(flag == 0) {
flag = 1;
p = (struct ListNode*)malloc(sizeof(struct ListNode));
p->val = l1->val + l2->val;
if(p->val > 9) {
last = p->val / 10;
p->val %= 10;
} else last = 0;
p->next = NULL;
head = p;
} else {
q = (struct ListNode*)malloc(sizeof(struct ListNode));
q->val = l1->val + l2->val + last;
if(q->val > 9) {
last = q->val / 10;
q->val %= 10;
} else last = 0;
q->next =NULL;
p->next = q;
p = q;
}
l1 = l1->next;
l2 = l2->next;
}
while(l1 != NULL) {
q = (struct ListNode*)malloc(sizeof(struct ListNode));
q->val = l1->val + last;
if(q->val > 9) {
last = q->val / 10;
q->val %= 10;
} else last = 0;
q->next =NULL;
p->next = q;
p = q;
l1 = l1->next;
}
while(l2 != NULL) {
q = (struct ListNode*)malloc(sizeof(struct ListNode));
q->val = l2->val + last;
if(q->val > 9) {
last = q->val / 10;
q->val %= 10;
} else last = 0;
q->next =NULL;
p->next = q;
p = q;
l2 = l2->next;
}
if(last > 0) {
q = (struct ListNode*)malloc(sizeof(struct ListNode));
q->val = last;
if(q->val > 9) {
last = q->val / 10;
q->val %= 10;
} else last = 0;
q->next =NULL;
p->next = q;
p = q;
}
return head;
}
一些感想
其實,當(dāng)時在解決這道題的時候,碰到過這樣的問題文章來源:http://www.zghlxwxcb.cn/news/detail-835680.html
Line 70: Char 15: runtime error: member access within misaligned address 0xbebebebebebebebe for type 'struct ListNode', which requires 8 byte alignment [ListNode.c]0xbebebebebebebebe: note: pointer points here<memory cannot be printed>
后來,在我看了AuthurLEE的文章之后,我才知道原來是忘記在初始化的時候,讓指針指向NULL
了(包括head指針,還有結(jié)構(gòu)體里面的next)文章來源地址http://www.zghlxwxcb.cn/news/detail-835680.html
到了這里,關(guān)于LeetCode | 兩數(shù)相加 C語言的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!