題目:
給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。
如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。
您可以假設除了數字 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;
}
}
結語:
晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!