淘寶優(yōu)惠券微網(wǎng)站開發(fā)手機(jī)版怎么用百度快照
題目描述:
給你兩個 非空 的鏈表,表示兩個非負(fù)的整數(shù)。它們每位數(shù)字都是按照 逆序 的方式存儲的,并且每個節(jié)點(diǎn)只能存儲 一位 數(shù)字。請你將兩個數(shù)相加,并以相同形式返回一個表示和的鏈表。你可以假設(shè)除了數(shù)字 0 之外,這兩個數(shù)都不會以 0 開頭。示例 1:輸入:l1 = [2,4,3], l2 = [5,6,4]
輸出:[7,0,8]
解釋:342 + 465 = 807.
示例 2:輸入:l1 = [0], l2 = [0]
輸出:[0]
示例 3:輸入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
輸出:[8,9,9,9,0,0,0,1]提示:每個鏈表中的節(jié)點(diǎn)數(shù)在范圍 [1, 100] 內(nèi)
0 <= Node.val <= 9
題目數(shù)據(jù)保證列表表示的數(shù)字不含前導(dǎo)零
算法一:
思路:
使用頭尾鏈表節(jié)點(diǎn)指針,用carry來存儲進(jìn)位值
代碼實(shí)現(xiàn):
/*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {struct ListNode *head = NULL, *tail = NULL;//頭尾節(jié)點(diǎn)指針int carry = 0;//進(jìn)位值while (l1 || l2) {//判斷是否有鏈表遍歷到末尾int n1 = l1 ? l1->val : 0;int n2 = l2 ? l2->val : 0;int sum = n1 + n2 + carry;//求和if (!head) {//確定新鏈表的起點(diǎn)head = tail = malloc(sizeof(struct ListNode));tail->val = sum % 10;tail->next = NULL;} else {//確定起點(diǎn)后,添加新節(jié)點(diǎn)(相加后的)tail->next = malloc(sizeof(struct ListNode));tail->next->val = sum % 10;tail = tail->next;tail->next = NULL;}carry = sum / 10;//進(jìn)位if (l1) {//未到達(dá)尾部,則后移l1 = l1->next;}if (l2) {l2 = l2->next;}}if (carry > 0) {//進(jìn)位判斷,若存在進(jìn)位,則添加最后一個節(jié)點(diǎn)tail->next = malloc(sizeof(struct ListNode));tail->next->val = carry;tail->next->next = NULL;}return head;//返回頭部節(jié)點(diǎn)
}