知識無價
初入力扣對鏈表的操作不熟悉,只是瞭解借鑑了別人優秀的代碼
我把一些地方編譯有錯的地方改了,下面是題目
通過的代碼
/**
* 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* cur1 = l1;
ListNode* cur2 = l2;
int count = 0;//每位之和
int s = 0;//進位
while(cur1->next !=NULL && cur2->next !=NULL){//加到其中有一個鏈表剩一位,或者兩個鏈表都只剩一位
count = cur1->val + cur2->val + s;
if(count > 9){
cur1->val = count % 10 ;
cur2->val = count % 10 ;
s = 1;
}else{
cur1->val = count;
cur2->val = count;
s = 0;
}
cur1 = cur1->next;
cur2 = cur2->next;
}
if(cur1->next == NULL && cur2->next == NULL){ //當兩個鏈表都只剩一位時
count = cur1->val + cur2->val +s;
if(count > 9)
{
cur1->val = count % 10;
cur2->val = count % 10;
s = 1;
}else{
cur1->val = count ;
cur2->val = count ;
s = 0;
}
if(s == 1){ //說明最後兩個數產生了進位,需要擴充鏈表。
ListNode* tmp = new ListNode(1);
cur1->next = tmp;
return l1;
}
return l1;
}
if(cur1->next == NULL){ //cur1鏈表剩一位
count = cur1->val + cur2->val + s ;
cur2->val = cur1->val + cur2->val;
if(count < 10){ //cur1的最後一位加cur2的一位 沒產生進位,直接返回
cur2->val = count;
return l2;
}
while(cur2->next != NULL){ //因爲有進位,需要再把cur2的剩餘數計算 直到最後一位
count = cur2->val + s;
if(count > 9){
cur2->val = count % 10 ;
s = 1;
} else{
cur2->val = count;
s = 0;
}
cur2 = cur2->next;
}
if(cur2->val + s > 9){ //判斷cur2 最後一位是否產生進位
cur2->val = (cur2->val + s) % 10;
s = 1;
}else{
cur2->val = cur2->val +s;
s = 0;
}
if(s == 1){ //產生進位,擴充鏈表
ListNode* tmp = new ListNode(1);
cur2->next = tmp;
return l2;
}
return l2;
}else{ //cur2鏈表剩一位
count = cur1->val + cur2->val + s;
cur1->val = cur2->val + cur1->val;
if(count < 10){ //cur2的最後一位加cur1的一位 沒產生進位,直接返回
cur1->val = count;
return l1;
}
while(cur1->next != NULL){ //因爲有進位,需要再把cur1的剩餘數計算 直到最後一位
count = cur1->val + s;
if(count > 9){
cur1->val = count % 10 ;
s = 1;
} else{
cur1->val = count;
s = 0;
}
cur1 = cur1->next;
}
if(cur1->val + s > 9){ //判斷cur1 最後一位是否產生進位
cur1->val = (cur1->val + s) % 10;
s = 1;
}else{
cur1->val = cur1->val +s;
s = 0;
}
if(s == 1){ //產生進位,擴充鏈表
ListNode* tmp = new ListNode(1);
cur1->next = tmp;
return l1;
}
}
return l1;
}
};
原創來源
不得不承認別人的代碼真的很優秀
學習這條路人煙稀少,寸步難行……
卻又不得不去堅持!