002兩數相加
阿新 • • 發佈:2020-08-05
寫在前面,參考的力扣官網的畫解演算法
連結串列
/* * @lc app=leetcode.cn id=2 lang=java * * [2] 兩數相加 */ // @lc code=start /** * 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) { //Tips:對於連結串列問題,返回結果為頭結點時,通常需要先初始化一個預先指標pre //該指標的下一個節點指向真正的頭結點head //使用預先指標的目的在於連結串列初始化時無可用節點值,而且連結串列的構造過程需要指標移動 //而且會導致頭指標丟失,無法返回結果 //新增預指標pre ListNode pre=new ListNode(0); //cur也指向pre ListNode cur=pre; //進位為0 int carry=0; //將兩個連結串列看成是相同長度的進行遍歷 while(l1!=null || l2!=null){ //如果一個連結串列較短則在前面補0 int x=l1==null?0:l1.val; int y=l2==null?0:l2.val; //每一位計算的同時需要考慮上一位的進位問題 int sum=x+y+carry; //而當前位計算結束後同樣需要更新進位值 //進位值變化 carry=sum/10; //實際存入連結串列 sum=sum%10; cur.next=new ListNode(sum); //新增節點並移動l1,l2.cur cur=cur.next; if(l1!=null) l1=l1.next; if(l2!=null) l2=l2.next; } //如果兩個連結串列全部遍歷完畢後,進位值為1,則在新連結串列最前方新增節點1 if(carry==1){ cur.next=new ListNode(carry); } //從pre.next開始返回改連結串列 return pre.next; } } // @lc code=end