日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【LeetCode每周算法】两数相加

發布時間:2025/3/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【LeetCode每周算法】两数相加 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/add-two-numbers

給你兩個?非空 的鏈表,表示兩個非負的整數。它們每位數字都是按照?逆序?的方式存儲的,并且每個節點只能存儲?一位?數字。

請你將兩個數相加,并以相同形式返回一個表示和的鏈表。

你可以假設除了數字 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
  • 題目數據保證列表表示的數字不含前導零

解法一:

根據鏈表特點,直接按順序遍歷,計算對應位的數值,同時記錄進位即可。

public class Add {public static void main(String[] args) {Add add = new Add();ListNode l1 = new ListNode(1);l1.next = new ListNode(2);ListNode l2 = new ListNode(9);l2.next = new ListNode(8); // l2.next.next = new ListNode(4);ListNode listNode = add.addTwoNumbers2(l1, l2);System.out.println(listNode);}public ListNode addTwoNumbers2(ListNode l1, ListNode l2) {// 定義當前遍歷到的節點--可以省略,直接使用l1和l2ListNode cur1 = l1;ListNode cur2 = l2;// 結果:待返回的nodeListNode node = null;// 處理返回鏈表中,當前節點的下一個節點ListNode next = null;// 相加后進位數值:8+3=11,則進位1int step = 0;// 這里遍歷次數執行定義為1000,因為條件中說明,數值最大不超過100位,也就是鏈表長度不可能超過100.// 這里可以優化,使用while循環,將下面的退出條件放在while條件中for (int i = 0; i < 1000; i++) {// 當前節點數值int val1 = 0;int val2 = 0;if (cur1 != null) {val1 = cur1.val;cur1 = cur1.next;}if (cur2 != null) {val2 = cur2.val;cur2 = cur2.next;}// 當前節點值加進位的數值之和int val = val1 + val2 + step;// 處理進位以及計算當前位置最終值step = val / 10;val = val - step * 10;if (node == null) {node = new ListNode(val);// 記錄next,方便給下一個節點關聯next = node;} else {next.next = new ListNode(val);next = next.next;}// 如果當前節點都為空,且沒有進位,則停止if (cur1 == null && cur2 == null && step==0) {break;}}return node;}}class ListNode {int val;ListNode next;ListNode() {}ListNode(int val) {this.val = val;}ListNode(int val, ListNode next) {this.val = val;this.next = next;} }

解法二:遞歸

遞歸退出條件:當兩個節點都是空的時候退出。
那如果有任一節點為空,另外一個節點不為空,那我們的節點相加邏輯就會出現空指針異常,在這里直接犧牲空間來滿足處理邏輯。
進位處理:默認在任何一個加數節點上即可,這里放在了l1上

/*** 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) {if(l1 == null && l2 ==null){return null;}if(l1 == null){l1 = new ListNode(0);}if(l2 == null){l2 = new ListNode(0);}int rval = l1.val + l2.val;if(rval >= 10){rval = rval % 10;if(l1.next != null){l1.next.val+=1;}else{l1.next = new ListNode(1);}}return new ListNode(rval, addTwoNumbers(l1.next, l2.next));} }

總結

以上是生活随笔為你收集整理的【LeetCode每周算法】两数相加的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。