零、題目
給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。
如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭
/**
- Definition for singly-linked list.
- struct ListNode {
-
int val;
-
struct ListNode *next;
- };
*/
一、閱讀題目
1 已知量:加法的兩個元素;
2 未知量:加法的結果;
3 條件:加法;
二、擬定方案
1 獲取加法中,每一位的分開的元素;
2 進位;
3 獲取每個節點的值;
4 插入節點,尾部插入;
三、code
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
struct ListNode* head = (struct ListNode*)malloc(sizeof(struct ListNode));
head->next = NULL;
struct ListNode* tail = head;
int carry = 0;
int l1Val;
int l2Val;
while(l1 != NULL || l2 != NULL || carry!=0)
{
if(l1 == NULL)
{
l1Val = 0;
}else
{
l1Val = l1->val;
}
if(l2 == NULL)
{
l2Val = 0;
}else
{
l2Val = l2->val;
}
int sum = l1Val +l2Val + carry;
carry = sum/10;
struct ListNode* sumNode = (struct ListNode*)malloc(sizeof(struct ListNode));
sumNode->val = sum%10;
sumNode->next = NULL;
tail->next = sumNode;
tail = sumNode;
if(l1 != NULL) l1 = l1->next;
if(l2 != NULL) l2 = l2->next;
}
return head->next;
}
四、回顧
1 這裏的尾部插入,與上一個題中的尾部插入不一樣
1) 將當前節點的next值,賦值給新創建的節點,然後再將本節點給加上;
2)生成本節點信息,將該節點信息賦值給鏈表中最後一個節點,然後再將鏈表中最後一個指針更新爲當前節點;
3)區別有兩點,第一是是否繼承了上一次鏈表中,最後一個節點的next值,爲空或者爲零;選擇爲零的原因是,此處使用數組模擬鏈表,初始化的表示下一個值得數組,默認值都爲零;
2 當前遇到兩種題型,第一是在什麼位置插入該節點,第二個是順序插入,但是插入什麼樣的節點;
3 一般情況都是尾部插入的方式,以及第一個節點爲空;