兩數相加(C#數據結構和算法練習)


兩數相加

給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。

如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。

您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。

示例:

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

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/add-two-numbers
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

算法思路和官方相同,但就語句而言或許可以進一步優化
關鍵代碼:

            ListNode result= new ListNode(0);      //當前節點,進行迭代
            ListNode head = result;                //頭節點
            int next = 0;                          //若相加大於10進位則next==1
            while (l1 != null || l2 != null)
            {
                int value1, value2;
                if (l1 == null)                   //當l1或l2為空時,假設值為0
                    value1 = 0;
                else
                    value1 = l1.val;
                if (l2 == null)
                    value2 = 0;
                else
                    value2 = l2.val;
                int temp = value1 + value2;
                result.val = temp + next;
                if (result.val < 10)             //判斷是否進位
                {
                    next = 0;
                }
                else
                {
                    result.val = result.val - 10;
                    next = 1;
                }
                if (l1 != null)                   //l1和l2不為空時迭代
                    l1 = l1.next;
                if (l2 != null)
                    l2 = l2.next;
                if (l1 == null && l2 == null)     //同時為空時結束,避免下方語句進行使得結果錯誤
                    break;
                result.next = new ListNode(0);
                result = result.next;
            }
            if (next == 1)                        //出現進位但l1和l2下一數字都為0時上述循環無法進行,做特殊處理
            {
                result.next = new ListNode(1);
            }
            return head;

 

完整代碼:

using System;
namespace numAdd
{
    public class ListNode
    {
    public int val;
    public ListNode next;
    public ListNode(int x) { val = x; }
    }
    class Program
    {
        public static ListNode AddTwonumbers(ListNode l1, ListNode l2)
        {
            ListNode result= new ListNode(0);      //當前節點,進行迭代
            ListNode head = result;                //頭節點
            int next = 0;                          //若相加大於10進位則next==1
            while (l1 != null || l2 != null)
            {
                int value1, value2;
                if (l1 == null)                   //當l1或l2為空時,假設值為0
                    value1 = 0;
                else
                    value1 = l1.val;
                if (l2 == null)
                    value2 = 0;
                else
                    value2 = l2.val;
                int temp = value1 + value2;
                result.val = temp + next;
                if (result.val < 10)             //判斷是否進位
                {
                    next = 0;
                }
                else
                {
                    result.val = result.val - 10;
                    next = 1;
                }
                if (l1 != null)                   //l1和l2不為空時迭代
                    l1 = l1.next;
                if (l2 != null)
                    l2 = l2.next;
                if (l1 == null && l2 == null)     //同時為空時結束,避免下方語句進行使得結果錯誤
                    break;
                result.next = new ListNode(0);
                result = result.next;
            }
            if (next == 1)                        //出現進位但l1和l2下一數字都為0時上述循環無法進行,做特殊處理
            {
                result.next = new ListNode(1);
            }
            return head;
        }
        static void Main(string[] args)          //簡單測試
        {
            ListNode l1 = new ListNode(9);
            l1.next = new ListNode(9);
            //l1.next.next = new ListNode(3);

            ListNode l2 = new ListNode(1);
            //l1.next = new ListNode(6);
            //l1.next.next = new ListNode(4);

            ListNode l3 = AddTwonumbers(l1, l2);
            while (l3 != null)
            {
                Console.WriteLine(l3.val);
                l3 = l3.next;
            }
        }
    }
}

算法

從最低一位開始相加,大於9則進位處理,直至到最后處理完成

以下特別情況要特別注意:

測試用例 說明
l1=[0,1],l2=[0,1,2]l2=[0,1,2] 當一個列表比另一個列表長時
l1=[],l2=[0,1]l2=[0,1] 當一個列表為空時,即出現空列表
l1=[9,9],l2=[1]l2=[1] 求和運算最后可能出現額外的進位,這一點很容易被遺忘


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM