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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[Leedcode][JAVA][第445题][链表][栈]

發布時間:2023/12/10 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Leedcode][JAVA][第445题][链表][栈] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【問題描述】445. 兩數相加 II

給你兩個 非空 鏈表來代表兩個非負整數。數字最高位位于鏈表開始位置。它們的每個節點只存儲一位數字。將這兩數相加會返回一個新的鏈表。你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。進階:如果輸入鏈表不能修改該如何處理?換句話說,你不能對列表中的節點進行翻轉。示例:輸入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4) 輸出:7 -> 8 -> 0 -> 7來源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/add-two-numbers-ii 著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

【解答思路】

1. 常規思路 鏈表反轉 然后按位相加 (入門)

時間復雜度:O(N) 空間復雜度:O(1)

/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/ class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {//反轉鏈表ListNode newl1 =reverse(l1);ListNode newl2 =reverse(l2);//處理進位 累加的和是否有超過10進位的情況int carry = 0;ListNode l3 = null;while(newl1!= null || newl2 != null|| carry!=0){int n1=0 , n2 = 0;//反轉后的鏈表取值并求和if(newl1 == null){n1 = 0;}else{n1 = newl1.val;newl1 = newl1.next; }if(newl2 == null){n2 = 0;}else{n2 = newl2.val;newl2 = newl2.next; }int sum = n1 + n2+ carry;//頭插法 根據和求當前位置的值 和 進位的值 并連接上鏈表 ListNode tmp = new ListNode(sum%10);tmp.next = l3;l3 = tmp;carry = sum /10;}return l3;}/*將給定頭結點的鏈表反轉*/private ListNode reverse(ListNode head){ListNode pre = null;while(head!=null){ListNode next = head.next;head.next = pre;pre = head;head = next;}return pre;} }
2. 逆序- 棧思想 (進階)

時間復雜度:O(N) 空間復雜度:O(N)

class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {/*//java stack源碼 推薦棧相關的用ArrayDeque類來實現 遵循官方建議所以用ArrayDequeDeque<Integer> stack1 = new ArrayDeque<Integer>();Deque<Integer> stack2 = new ArrayDeque<Integer>();*/Stack<Integer> stack1 = new Stack<>();Stack<Integer> stack2 = new Stack<>();//將兩個鏈表分別入棧while(l1!=null){stack1.push(l1.val);l1=l1.next;}while(l2!=null){stack2.push(l2.val);l2= l2.next;}int carry =0;ListNode after = null;while(!stack1.isEmpty()||!stack2.isEmpty()||carry!=0){//棧先進后出的性質 所以取出的是最后入棧的元素 并求和int n1 = stack1.isEmpty()?0:stack1.pop();int n2 = stack2.isEmpty()?0:stack2.pop();int sum = n1+n2+carry;//根據和求當前位置的值 和 進位的值 并連接上鏈表ListNode tmp = new ListNode(sum%10);tmp.next = after;after = tmp;carry=sum/10;}return after;} }

【總結】

1.反轉鏈表 頭插法(多畫圖理解)
/*將給定頭結點的鏈表反轉*/private ListNode reverse(ListNode head){ListNode pre = null;while(head!=null){ListNode next = head.next;head.next = pre;pre = head;head = next;}
2. 逆序- 棧思想
3. 三目運算符(邏輯極度清晰的時候使用)

<表達式1> ? <表達式2> : <表達式3>; "?"運算符的含義是:先求表達式1的值,如果為真,則執行表達式2,并返回表達式2的結果;如果表達式1的值為假,則執行表達式3,并返回表達式3的結果。

總結

以上是生活随笔為你收集整理的[Leedcode][JAVA][第445题][链表][栈]的全部內容,希望文章能夠幫你解決所遇到的問題。

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