用鏈表表示整數(shù)秋柄,求其相加得到的結(jié)果。
考察基本的鏈表操作蠢正。
因為用的是Java刷題骇笔,所以要清楚Java的鏈表實現(xiàn)。
Java用引用實現(xiàn)鏈表嚣崭,其實引用和指針有很多相似的地方笨触,只不過引用更加安全。
思路
模仿數(shù)電中的全加器設(shè)計雹舀,一個數(shù)位的計算包括:
上一位進位芦劣,本位對應(yīng)的兩條鏈表節(jié)點的數(shù)值
記錄下本位的加和結(jié)果,向下一位傳進位值
c1 = (p1.val + p2.val + c0) / 10;
s = (p1.val + p2.val + c0) % 10;
邊界情況分析
這些邊界情況有時無法全部想到葱跋,只有敲代碼的時候才能全面持寄。但是大家編程之前還是要好好考慮一下源梭,不然代碼調(diào)試起來非秤榘常花時間稍味。
一條鏈表為空
直接返回另外一條鏈表一條鏈表到達了末尾,另外一條沒有
加一個判斷荠卷,未到末尾的繼續(xù)遍歷模庐,不過只用一條鏈表節(jié)點的數(shù)值加低位進位了退出循環(huán)了但是還有進位
在末尾添加一個節(jié)點
復(fù)雜度分析
一趟遍歷就可以了,所以復(fù)雜度由較長的鏈表決定
為O(max(m , n))
public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode p1 = l1, p2 = l2;
if(p1 == null){
return p2;
}
if(p2 == null){
return p1;
}
ListNode result = new ListNode(0), p3 = result;
int c0 = 0 , c1 = 0, s = 0;
while (p1 != null || p2 != null) {
if(p1 != null && p2 != null) {
c1 = (p1.val + p2.val + c0) / 10;
s = (p1.val + p2.val + c0) % 10;
p1 = p1.next;
p2 = p2.next;
}else{
ListNode node;
if(p1 != null){
node = p1;
p1 = p1.next;
}else {
node = p2;
p2 = p2.next;
}
c1 = (node.val + c0) / 10;
s = (node.val + c0) % 10;
}
c0 = c1;
p3.next = new ListNode(s);
p3 = p3.next;
}
if(c0 != 0){
p3.next = new ListNode(c0);
}
return result.next;
}