題目:
給出兩個 非空 的連結清單用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,并且它們的每個節點隻能存儲 一位 數字。
如果,我們将這兩個數相加起來,則會傳回一個新的連結清單來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
思路: 因為這個題必須使用連結清單來寫,思路并不難,主要就是要熟悉連結清單和指針,然後就可以好好複習一下連結清單了,這些基礎知識我真是完全不記得了,完全是寫給智障的自己看的,問了大佬很多弱智的問題鴨。我就是要全部記下來,怕自己三天以後又忘了。
1. 連結清單的操作很棒的一個連結 :https://www.cnblogs.com/byonecry/p/4458821.html.
2. 首先分析這個題,連結清單1,連結清單2。如果長度一樣,就要直接相加,然後考慮進位的問題,如果長度不一樣,短的連結清單該位賦為0.
3.1 結構體中 定義 *next 是指向下一個結構體的指針;
3.2 c++中 定義一個結構體變量的方法 : ListNode phead (0), *p = &phead ;現在的phead是一個空的頭指針,必須定義一個結構體指針取其位址
3.3 指針通路結構體 用p-> ,變量通路結構體元素 用 phead.next
3.4 p->next = new ListNode(sum%10); p=p->next; 這個為連結清單的正常操作,生成一個新的節點,并将其連接配接起來;
3.5 至于為什麼是傳回 phead.next,因為以上的操作已經生成了一個完整的連結清單,ListNode *next 裡面依舊可以指向一個*next
代碼:
/**
* 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 phead (0), *p = &phead;
int sum=0;
int a=0; //進位
while(l1||l2||a){ //全部為0, 才能停止循環
int sum=(l1 ? l1->val : 0)+(l2 ? l2->val : 0)+a; //這個表示真的好棒
a=sum/10;
p->next = new ListNode(sum%10);
p=p->next;
l1=l1 ? l1->next : l1;
l2=l2 ? l2->next : l2;
}
return phead.next;
}
};