兩數(shù)相加(難度:中等)
題目描述:
給出兩個 非空 的鏈表用來表示兩個非負(fù)的整數(shù)僧鲁。其中樱哼,它們各自的位數(shù)是按照 逆序 的方式存儲的洁墙,并且它們的每個節(jié)點只能存儲 一位 數(shù)字誊垢。
如果掉弛,我們將這兩個數(shù)相加起來症见,則會返回一個新的鏈表來表示它們的和。
您可以假設(shè)除了數(shù)字 0 之外殃饿,這兩個數(shù)都不會以 0 開頭谋作。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
解法:
按照我們小學(xué)學(xué)習(xí)的兩個多位數(shù)的相加,從各位開始乎芳,各位與各位相加遵蚜,如果大于10則進(jìn)位,保留其與10的余數(shù)奈惑。接下來十位吭净,百位,亦是如此肴甸。直到有一個數(shù)的沒有更高位寂殉,則把另一個數(shù)的剩余高位補(bǔ)到結(jié)果的高位,此時需要判斷原在,是否有進(jìn)位友扰,如有進(jìn)位,還需把進(jìn)位也加之到結(jié)果上庶柿。
這道題主要是對鏈表的一些操作村怪。
具體步驟:
(1)判斷兩個鏈表的所取結(jié)點至少有一個不為null(表示相加還未結(jié)束)
(2)如果有一個鏈表索取結(jié)點已經(jīng)為null了,則讓其所取數(shù)為0浮庐,便于另一個數(shù)相加甚负。
(3)相加兩個所取的數(shù)字之和sum
(4)計算sum對10的商值,即目前的進(jìn)位审残。
(5)在結(jié)果鏈表上保存當(dāng)前sum對10的余數(shù)梭域,即結(jié)果數(shù)字的當(dāng)前位。
(6)將兩個鏈表的指針都指向下一個結(jié)點维苔。繼續(xù)從第(1)步循環(huán)進(jìn)行碰辅,直到不滿足(1)的條件。
(7)判斷是否兩數(shù)相加結(jié)束后仍存在進(jìn)位介时,如果有没宾,則在結(jié)果鏈表上創(chuàng)建一個新的結(jié)點,用來保存最后一次的進(jìn)位(結(jié)果邊界判斷)沸柔。
package com.company.project.hot100;
public class Question02 {
public static class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode t = new ListNode(0);
ListNode s = t;
int c = 0;
while (l1 != null || l2 != null) {
int x = l1 == null ? 0 : l1.val;
int y = l2 == null ? 0 : l2.val;
int sum = x + y + c;
c = sum /10;
sum = sum %10;
s.next = new ListNode(sum);
s = s.next;
if(l1 != null) {
l1 = l1.next;
}
if(l2 != null) {
l2 = l2.next;
}
}
if(c != 0) {
s.next = new ListNode(c);
}
return t.next;
}
public static void main(String[] args) {
ListNode l1 = new ListNode(2);
l1.next = new ListNode(4);
l1.next.next = new ListNode(3);
ListNode l2 = new ListNode(5);
l2.next = new ListNode(6);
l2.next.next = new ListNode(4);
ListNode s = addTwoNumbers(l1, l2);
while (s != null) {
System.out.println(s.val);
s = s.next;
}
}
}