1. 程式人生 > >【Leetcode一刷】2.兩數相加

【Leetcode一刷】2.兩數相加

難度:中等

題目: 給定兩個非空連結串列來表示兩個非負整數。位數按照逆序方式儲存,它們的每個節點只儲存單個數字。將兩數相加返回一個新的連結串列。 你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。

示例: 輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 輸出:7 -> 0 -> 8 原因:342 + 465 = 807

解答:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) { struct ListNode *l3 = (struct ListNode *)malloc(sizeof(struct ListNode)); l3->val = 0; l3->next = NULL; struct ListNode *head = (struct ListNode *)malloc(sizeof(struct ListNode)); head->next = l3;
while (l1!=NULL || l2!=NULL){ //printf("%d ", l1->val); //printf("%d \n", l2->val); if (l1 == NULL){ l1 = (struct ListNode *)malloc(sizeof(struct ListNode)); l1->val = 0; l1->next = NULL; } if (l2 == NULL){ l2 =
(struct ListNode *)malloc(sizeof(struct ListNode)); l2->val = 0; l2->next = NULL; } l3->val += l1->val+l2->val; if (l1->next!=NULL || l2->next!=NULL || l3->val>=10){ l3->next = (struct ListNode *)malloc(sizeof(struct ListNode)); l3->next->val = 0; l3->next->next = NULL; } if (l3->val>=10){ l3->next->val += 1; } l3->val = l3->val%10; l1 = l1->next; l2 = l2->next; l3 = l3->next; } l3 = head->next; return l3; }

結果 在這裡插入圖片描述

討論

這題弱雞如我de了很久的bug,特別是兩個數各自到了盡頭的情況。一直處理不清楚的一個點就是是否要為l3l_3申請下一位的空間,好在最後總算搞定了,不枉我寫到兩點鐘嗚嗚嗚。