[Leedcode][JAVA][第445题][链表][栈]
生活随笔
收集整理的這篇文章主要介紹了
[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题][链表][栈]的全部內容,希望文章能夠幫你解決所遇到的問題。