力扣原題:兩數相加,

先貼代碼:
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode l3 = new ListNode(-1); //定義一個新鏈表的頭節點l3
ListNode node3 = l3; //定義頭節點的副本node3
int ex = 0; //定義一個進位值ex
while (l1 != null || l2 != null){
ListNode nodeNext = new ListNode(-1); //定義node的后繼節點
node3.next = nodeNext;
//將l1的val賦值給a
int a = 0;
if (l1 != null){
a = l1.val;
}
//將l2的val賦值給b
int b = 0;
if (l2 != null){
b = l2.val;
}
//將a和b的和賦值給c再加上進位值ex即為放入新鏈表的和
int c = a + b + ex;
//進行判斷;若c >= 10 則產生進位值
if (c >= 10){
c = c - 10;
nodeNext.val = c;
ex = 1;
}else {
nodeNext.val = c;
ex = 0;
}
//以下各節點往后走一步
node3 = node3.next;
if (l1 != null) {
l1 = l1.next;
}
if (l2 != null) {
l2 = l2.next;
}
}
//若回圈走完仍然有進位值,則說明最后一位值位10,所以再新建一個尾巴節點值位1
if (ex == 1){
ListNode cur = new ListNode(1);
node3.next = cur;
}
//回傳頭節點的next域
return l3.next;
}
解題思路:
在本題題目中給了我們兩條鏈表,分別表示兩個非負的整數,每位數字都是按照逆序的方式存盤的,說明一條鏈表表示的整數正確讀法應該是反過來讀;例如鏈表:2->3->4 ,那它表示的數字應該為432,所以每一個鏈表第一個節點都代表著個位數,即在兩數相加程序中,進位值都會進入next域,由此我便想到了,先創建一個新的鏈表,新鏈表每個節點都來儲存其兩條鏈表各節點相加的值:

然后就可以設定回圈,要求鏈表1和鏈表2都走完時回圈結束:

進入回圈后新建一個節點來存盤鏈表1和鏈表2節點的和:

再將鏈表1和鏈表2的節點值相加:

注意:進入回圈前已經設定了進位值ex為0,代表開始時沒有進位,
對節點和c進行判斷,若其大于等于10說明產生了進位值,將ex賦為1,傳入下一次回圈中,

之后將各節點往后走一步:

注意:為了避免空指標例外,鏈表1和鏈表2在遍歷時需要判斷其是否為null,若是則不能將其指向next域,
等待回圈走完后若此時進位值ex為0,說明原先兩條鏈表最后一個節點相加值小于10,就不需要進位了;若ex值位1,說明已經產生進位,還需要再新建一個節點,其值為1,接到新鏈表的后面,此時就會有疑問:為什么新建節點val值為1?
![]()
在原題目中提示了Node.val值域是0到9,所以兩節點之和最大也只是18,即若有進位值的話,它的值有且僅有1,所以新建節點值位1,
PS:此題解僅為個人解法,可能并非最優解法,若有錯誤及疑問歡迎指出,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/387898.html
標籤:其他
上一篇:圖的寬度優先遍歷
