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

来源:https://www.cnblogs.com/asahiLikka/archive/2019/10/13/11668159.html
-Advertisement-
Play Games

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


兩數相加

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

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

您可以假設除了數字 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] 求和運算最後可能出現額外的進位,這一點很容易被遺忘

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 範例:JDBC查詢 package com.hsp; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import jav ...
  • 1.面向對象和麵向過程的區別? 面向過程:面向過程性能比面向對象高 面向對象:面向對象易維護、易復用、易擴展 面向過程:面向過程性能比面向對象高 面向對象:面向對象易維護、易復用、易擴展 2.Java 語言有哪些特點? 簡單易學、面向對象(封裝,繼承,多態)、平臺無關性( Java 虛擬機實現平臺無 ...
  • Thymeleaf在模板中使用 #dates 或 #calendars 兩個對象來處理日期,這兩個對象大部分類似。 ...
  • 本文主要講解Spring開發中三種不同的註入方式,以及集合數據類型的註入,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 首先看一下@FeignClient註解的源碼: 可以看出@FeignClient註解被@Target(ElementType.TYPE)修飾,表示@FeignClient註解的作用目標在介面上。 針對其常用屬性做如下歸納: String name():指定FeignClient的名稱,如果項目使用了 ...
  • 本文首發於微信公眾號:程式員喬戈里 轉載請註明:https://blog.csdn.net/WantFlyDaCheng/article/details/102538508 一、兩次的 git commit 到不是同一個遠程分支 這裡由於提交自己的代碼第一次提交到A分支,第二次提交B分支,然後報錯了 ...
  • 記錄嵌入式Linux+NetCore培訓中遇到的一些問題以及解決方法 十一放假期間發現園裡大神大石頭(NewLife團隊)開了一個嵌入式Linux+NetCore培訓,就報名參加了。更幸運的是,我剛好最後一個名額。 今天中午收到大石頭髮的快遞,立馬取回來拆開接好樹莓派的線,然後開機啟動。本人之前沒有 ...
  • 本篇博客主要解決在前後端分離項目中,後臺為前端人員提供詳細API介面說明的問題,該文主要通過在Web API項目中修改WebApi HelpPage相關代碼和添加WebApiTestClient組件實現WebAPI介面詳細說明以及介面測試。 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...