文章目錄
- 前言:
- 題目要求
- 代碼 實作步驟
- 1,創建一個 節點變數 head 和 tail(尾巴),head 用來表示頭節點位置,tail 用來表示尾結點位置,
- 2.既然相加,就會存在進位,逢十進一,定義一個了 整形變數 carry 用來記錄 十位數字
- 相加
- 創造節點存資料
- 判斷 是否 產生了 carry 進制數
- 遍歷
- 將最終結果 回傳
- 最后附上程式
- 文章最后,我交代一下, 那個 判斷 carry 的代碼,你可以 放到 計算 和sum的后面,所以請不要遲疑,因為后面的代碼,不受 carry 代碼 位置的影響,
前言:
如果有對鏈表不熟悉的,可以參考 順序表 和 鏈表 - 單向鏈表部分
題目要求
這個題目的 逆序 是廢物條件,不用關注, 因為,它要求 最終 結果也是以相同結果來存盤的, 其實你逆序了,最后還有再逆序回來,就跟沒逆序一樣,事實上也沒錯,所以我們直接將兩個鏈表相對應位置的val相加就行了,
?
代碼 實作步驟
1,創建一個 節點變數 head 和 tail(尾巴),head 用來表示頭節點位置,tail 用來表示尾結點位置,

新的鏈表,肯定是 null的!因為還不知 l1 和 l2 的 val 值,萬一他們為null,那我 new 一個 節點物件干什么?浪費資源,
?
2.既然相加,就會存在進位,逢十進一,定義一個了 整形變數 carry 用來記錄 十位數字

?
相加

?
創造節點存資料

?
判斷 是否 產生了 carry 進制數

?
遍歷

?
將最終結果 回傳
注意一個小細節:想想看如果兩個鏈表 在最后一次相加的時候,發生進位,那么這個進位數往那放?你要明白:此時 while回圈已經結束了,那我們該怎么處理這個進位數?
?
答:既然發生了進位,carry 一定是大于0的,這點我們是可以確定的!我們學的是java,要知道java,萬物皆物件,沒有一個節點去存盤它,我就new一個節點給它,害怕它沒物件要?
?
最后附上程式
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode head = null,tail = null;
int carry = 0;
while(l1 != null || l2 !=null){
int val1 = l1!=null ? l1.val : 0;
int val2 = l2!=null ? l2.val : 0;
int sum = val1 + val2 + carry;
if(head==null){
// 第一次存入資料節點時: 頭尾節點 應該都指向該節點
head = tail = new ListNode(sum%10);
}else{// 非第一次存入資料節點
tail.next = new ListNode(sum%10);
tail = tail.next;
// 這就是 鏈表的 add功能,默認 add添加到屁股位置
}
carry = sum/10; // 獲取此時 l1 和 l2 節點val值之和的十位數
if(l1 != null){
l1 =l1.next;
}
if(l2 != null){
l2 = l2.next;
}
}
if(carry>0){
tail.next = new ListNode(carry);
// 這里就不用擔心它是兩位數,因為每個節點val都是一位,相加的結果不可能是 3位數,
// 最多2 位數,再加上前面我們對其進行 “/10” ,所以 carry 鐵定是一位數
tail = tail.next; // 最后別忘記了,尾巴節點,永遠指向鏈表的尾節點
}
return head;
}
}

?
文章最后,我交代一下, 那個 判斷 carry 的代碼,你可以 放到 計算 和sum的后面,所以請不要遲疑,因為后面的代碼,不受 carry 代碼 位置的影響,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/385586.html
標籤:java


