LeetCode第2號題–兩數相加,445號題–兩數相加II
題目如下
//2.兩數相加
給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。
如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
//445. 兩數相加II
給定兩個非空鏈表來代表兩個非負整數。數字最高位位於鏈表開始位置。它們的每個節點只存儲單個數字。將這兩數相加會返回一個新的鏈表。
你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。
進階:
如果輸入鏈表不能修改該如何處理?換句話說,你不能對列表中的節點進行翻轉。
示例:
輸入: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出: 7 -> 8 -> 0 -> 7
解答
445號題是2號題的一個升級版
2.兩數相加
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummyHead = new ListNode(0);
ListNode node = dummyHead;
int count = 0;
while (l1 != null || l2 != null || count != 0) {
int val1 = l1 != null ? l1.val : 0;
int val2 = l2 != null ? l2.val : 0;
int sumVal = val1 + val2 + count;
count = sumVal / 10;
node.next = new ListNode(sumVal % 10);
node = node.next;
if (l1 != null)
l1 = l1.next;
if (l2 != null)
l2 = l2.next;
}
return dummyHead.next;
}
445號題我們同樣可以使用2號題的思想,但是需要先把兩鏈表進行反轉
445.兩數相加II:方法一
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode rev1 = reverseList(l1);
ListNode rev2 = reverseList(l2);
ListNode ret = null;
ListNode pre = null;
int count = 0;
while (rev1 != null || rev2 != null || count != 0) {
int val1 = rev1 != null ? rev1.val : 0;
int val2 = rev2 != null ? rev2.val : 0;
int sumVal = val1 + val2 + count;
count = sumVal / 10;
pre = ret;
ret = new ListNode(sumVal % 10);
ret.next = pre;
if (rev1 != null)
rev1 = rev1.next;
if (rev2 != null)
rev2 = rev2.next;
}
return ret;
}
public ListNode reverseList(ListNode cur) {
ListNode ret = null;
while (cur != null) {
ListNode temp = cur.next;
cur.next = ret;
ret = cur;
cur = temp;
}
return ret;
}
445號題目中有一個進階:
如果輸入鏈表不能修改該如何處理?換句話說,你不能對列表中的節點進行翻轉。
如果要完成不對列表中的結點進行翻轉,我們可以使用雙棧法來解決這道題
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//使l1和l2按照 逆序 的方式存儲在s1和s2
LinkedList<Integer> s1 = new LinkedList<>();
LinkedList<Integer> s2 = new LinkedList<>();
while (l1 != null) {
s1.addFirst(l1.val);
l1 = l1.next;
}
while (l2 != null) {
s2.addFirst(l2.val);
l2 = l2.next;
}
int count = 0;
ListNode ret = null;
while (!s1.isEmpty() || !s2.isEmpty() || count != 0) {
int a1 = 0, a2 = 0;
if (!s1.isEmpty())
a1 = s1.removeFirst();
if (!s2.isEmpty())
a2 = s2.removeFirst();
count = (a1 + a2 + count) / 10;
ListNode curNode = new ListNode((a1 + a2 + count) % 10);
curNode.next = ret;
ret = curNode;
}
return ret;
}