1. 程式人生 > 其它 >LeetCode No2 兩數相加

LeetCode No2 兩數相加

題目

給你兩個 非空 的連結串列,表示兩個非負的整數。它們每位數字都是按照 逆序 的方式儲存的,並且每個節點只能儲存 一位 數字。
請你將兩個數相加,並以相同形式返回一個表示和的連結串列。
你可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。

示例 1:

輸入:l1 = [2,4,3], l2 = [5,6,4]
輸出:[7,0,8]
解釋:342 + 465 = 807.

示例 2:

輸入:l1 = [0], l2 = [0]
輸出:[0]

示例 3:

輸入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
輸出:[8,9,9,9,0,0,0,1]

提示:

每個連結串列中的節點數在範圍 [1, 100] 內
0 <= Node.val <= 9
題目資料保證列表表示的數字不含前導零

思路

題目意思很明確,可以直接理解為一個大數加法,先定義一個進位符c,然後將兩個連結串列按照對應的位數上相加再加上進位符c作為結果,如果超出10,對10取餘,然後進位符c置為1,迴圈相加到兩個連結串列都迴圈完,兩個連結串列都遍歷完後,注意進位,如果進位不為0,還需再要加上進位符c。

AC程式碼

點選檢視程式碼
class Solution {
	public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
		if( l1==null ) {
			return l2;
		}
		if( l2 == null ) {
			return l1;
		}
		int a = l1.val; int b = l2.val;
		int c = (a+b)/10;
		int d = (a+b)%10;
		l1 = l1.next;
		l2 = l2.next;
		ListNode l3 = new ListNode(d);
		ListNode l4 = l3;
		while( l1!=null || l2!=null ) {
			a = l1==null?0:l1.val;
			b = l2==null?0:l2.val;
			d = (a+b+c)%10;
			l4.next = new ListNode(d);
			c = (a+b+c)/10;
			if( l1!=null) {
				l1 = l1.next;
			}
			if( l2!=null ) {
				l2 = l2.next;
			}
			l4 = l4.next;
		}
		if( c!=0 ) {
			l4.next = new ListNode(1);
		}
		return l3;
	}
}