1. 程式人生 > 實用技巧 >002兩數相加

002兩數相加

寫在前面,參考的力扣官網的畫解演算法

連結串列

/*
 * @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