作為一個(gè)代碼量很少的初學(xué)者,做這些題真的真的,有點(diǎn)難。可能難不在思路,而是,不知道怎么實(shí)現(xiàn)。
題目
第二題通過(guò)兩個(gè)類(lèi)似鏈表的數(shù)據(jù)結(jié)構(gòu)給出兩個(gè)整數(shù),其中每一個(gè)節(jié)點(diǎn)代表一位數(shù)字,然后要求輸出這兩個(gè)鏈表的和
//Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
//Output: 7 -> 0 -> 8
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
- 這里第一各節(jié)點(diǎn)代表個(gè)位,然后往后一次類(lèi)推,這樣就有一個(gè)進(jìn)位的問(wèn)題,并且就不涉及到一個(gè)再轉(zhuǎn)化的問(wèn)題,比如,如果第一個(gè)節(jié)點(diǎn)是最高位,那么就需要再轉(zhuǎn)化一次了,應(yīng)該用
stack吧。 - 只給了一個(gè)構(gòu)造函數(shù),(假設(shè)其他的構(gòu)造函數(shù)都有了,比如拷貝、賦值)。作為菜鳥(niǎo),如何初始化第一個(gè)節(jié)點(diǎn)難住我了。 - -|
就這么兩點(diǎn)吧!
代碼如下:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
//使用result_tmp記錄,result的第一個(gè)節(jié)點(diǎn)
//這樣再返回的時(shí)候直接返回result->next就可以
//不用考慮初始化的問(wèn)題了
ListNode *result = new ListNode(0) ,
*result_tmp(result);
//這里拷貝一遍,不修改原有的參數(shù)
ListNode *l1_tmp(l1);
ListNode *l2_tmp(l2);
//這個(gè)是進(jìn)位的標(biāo)志
int goHeight=0;
while(l1_tmp != nullptr || l2_tmp != nullptr){
//這個(gè)兩個(gè)數(shù)的和
int add_tmp;
//如果是個(gè)空節(jié)點(diǎn),那么值就可以是0
int l1_val=l1_tmp == nullptr?0:l1_tmp->val;
int l2_val=l2_tmp == nullptr?0:l2_tmp->val;
add_tmp = l1_val + l2_val+goHeight;
//處理進(jìn)位
go = add_tmp/10;
add_tmp = add_tmp % 10;
result->next=new ListNode(add_tmp);
//繼續(xù)往下構(gòu)造鏈表
result=result->next;
//這里,如果是個(gè)空節(jié)點(diǎn)
//那么就只讓他等于nullptr就不要在往下訪問(wèn)了
l1_tmp=l1_tmp == nullptr?nullptr:l1_tmp->next;
l2_tmp=l2_tmp == nullptr?nullptr:l2_tmp->next;
}
//如果循環(huán)完了有進(jìn)位的話,那么就需要在添加一個(gè)節(jié)點(diǎn)
if (go==1){
result->next=new ListNode(go);
}
//配合上面記錄的第一個(gè)節(jié)點(diǎn)
//這里直接返回他的第二節(jié)點(diǎn)就可以了
//應(yīng)為第一個(gè)節(jié)點(diǎn)的val=0,和兩個(gè)鏈表的和無(wú)關(guān)。
return result_tmp->next;
}
這里還有另一個(gè)方式
//直接一個(gè)空指針,然后操作檢測(cè),如果是個(gè)空指針,表明還沒(méi)放和
//如果不是空指針,那么說(shuō)明已經(jīng)放了和
ListNode *node = NULL
ListNode *tmp = new ListNode(res);
if(node == NULL) {
node=tmp;
}else{
node->next=tmp;
}
嗯,就這樣了。
變量名用的也是,亂七八糟。
leetcode同一段代碼提交兩次測(cè)試出來(lái)的Runtime 不一樣。