個人認為,該題目可以看作合并兩個鏈表的變種題,本題與21題不同的是,再處理兩個結點時,對比的不是兩者的大小,而是兩者和是否大于10,加法計算中大于10要進位,所以我們需要聲明一個用來標記是否進位的值。
解題思路:
1、直接從鏈表頭部開始相加就是從數字的最低位開始相加。
2、同時遍歷兩個鏈表,將對應位置的數字相加,并考慮前一位的進位。
3、每次相加后,可能會有進位(即和大于等于10),需要將進位加到下一位的計算中。
4、如果兩個鏈表長度不同,較短的鏈表在后續遍歷中可以視為?0
。
5、如果遍歷完所有節點后仍有進位,需要額外創建一個節點來存儲這個進位。
代碼:
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{struct ListNode* l3=malloc(sizeof(struct ListNode));struct ListNode* head=l3;int carry=0;
//兩個鏈表不為空或有進位時,進行計算while(l1!=NULL||l2!=NULL||carry!=0){// 初始化和為當前進位int sum=carry;if(l1!=NULL){
// 如果 l1 不為空,累加 l1 的當前值,并移動 l1 到下一個節點sum+=l1->val;l1=l1->next;}if(l2!=NULL){// 如果 l2 不為空,累加 l2 的當前值,并移動 l2 到下一個節點sum+=l2->val;l2=l2->next;}//進位的數字計算carry=sum/10;sum%=10;
//在結果鏈表創建新結點,存儲suml3->next=malloc(sizeof(struct ListNode));l3=l3->next;l3->val=sum;l3->next=NULL;}
// 返回結果鏈表的頭節點(跳過虛擬頭節點)return head->next;
}