LeetCode解析------2.兩數相加-數學、鏈表

題目:

給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。
如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。

示例:

輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807

簡單介紹:
題目:兩數相加
題目難度:中等
使用語言:JAVA。
這道題來自leetcode題庫的數學、鏈表標籤。

解題思路:
首先看題、分析題意,我們可以明確1個關鍵點:
1.如何處理進位問題
既然,我們已經分析出來題目的關鍵任務了,下面我們就可以開始思考實現了。
我們採用算法與數據結構的思路來剖析一下這題,

數據結構:
要實現對數據的操作,我們要先明確存儲數據的數據結構。
該題的數據結構的作用:
1.設置一個空鏈表,保存結果
2.設置一個整型變量,保存進位

算法:
既然明確了我們的數據結構,我們就可以開始我們的算法分析了。
1.遍歷鏈表,計算當前位置的值。
2.保存進位,待下一輪使用
3.返回result.next,因爲第一個0是無效的

代碼部分:

/**
 * 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 result=new ListNode(0);//結果
       ListNode p=l1,q=l2,curr=result;
       int carry=0;
       while(p!=null||q!=null){
           int x=(p!=null)?p.val:0;
           int y=(q!=null)?q.val:0;
           int sum=carry+x+y;
           carry=(sum/10);//進位
           curr.next=new ListNode(sum%10);//保存數字
           curr=curr.next;
           if(p!=null)p=p.next;
           if(q!=null)q=q.next;
       }
       if(carry>0) curr.next=new ListNode(carry);//保存數字

       return result.next;
}
}

在這裏插入圖片描述

結語:
晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章