每日一題——兩數相加

兩數相加

    • 問題描述
    • 問題分析
    • 解題思路
    • 代碼實現
    • 代碼解析
    • 注意事項
    • 示例運行
    • 總結

問題描述

在這里插入圖片描述
給定兩個非空鏈表,表示兩個非負整數。鏈表中的每個節點存儲一個數字,數字的存儲順序為逆序(即個位在鏈表頭部)。要求將這兩個數字相加,并以相同形式返回一個表示和的鏈表。

示例:

  1. 輸入:l1 = [2,4,3]l2 = [5,6,4]
    輸出:[7,0,8]
    解釋:342 + 465 = 807

  2. 輸入:l1 = [0]l2 = [0]
    輸出:[0]

  3. 輸入:l1 = [9,9,9,9,9,9,9]l2 = [9,9,9,9]
    輸出:[8,9,9,9,0,0,0,1]

提示:

  • 每個鏈表中的節點數在范圍 [1, 100] 內。
  • 0 <= Node.val <= 9
  • 題目數據保證鏈表表示的數字不含前導零。

問題分析

  1. 鏈表結構:鏈表是一種線性數據結構,每個節點包含一個值和指向下一個節點的指針。本題中,鏈表的節點值表示數字的每一位。
  2. 逆序存儲:鏈表的頭節點存儲的是數字的個位,鏈表的尾節點存儲的是數字的最高位。
  3. 進位處理:在逐位相加時,可能需要處理進位的情況。

解題思路

  1. 創建虛擬頭節點:為了方便操作,創建一個虛擬頭節點 dummy,其 next 指針指向結果鏈表的頭節點。
  2. 遍歷鏈表:同時遍歷兩個鏈表,逐位相加,并處理進位。
  3. 處理剩余部分:如果其中一個鏈表先遍歷完,繼續處理另一個鏈表的剩余部分。
  4. 處理最終進位:如果最后還有進位,需要在結果鏈表末尾添加一個新節點。

代碼實現

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {// 創建虛擬頭節點struct ListNode* dummy = (struct ListNode*)malloc(sizeof(struct ListNode));struct ListNode* current = dummy;int carry = 0;  // 進位標志// 遍歷兩個鏈表while (l1 || l2) {// 獲取當前節點的值(如果鏈表為空,則為0)int n1 = l1 ? l1->val : 0;int n2 = l2 ? l2->val : 0;// 計算當前位的和int sum = n1 + n2 + carry;carry = sum / 10;  // 更新進位sum = sum % 10;    // 當前位的值// 創建新節點存儲當前位的值current->next = (struct ListNode*)malloc(sizeof(struct ListNode));current->next->val = sum;current->next->next = NULL;current = current->next;// 移動鏈表指針if (l1) {l1 = l1->next;}if (l2) {l2 = l2->next;}}// 如果最后還有進位,添加一個新節點if (carry > 0) {current->next = (struct ListNode*)malloc(sizeof(struct ListNode));current->next->val = carry;current->next->next = NULL;}// 返回結果鏈表的頭節點return dummy->next;
}

代碼解析

  1. 虛擬頭節點dummy 是一個虛擬頭節點,用于簡化鏈表操作。最終返回的結果鏈表是 dummy->next
  2. 逐位相加:通過 n1n2 獲取當前節點的值,加上進位 carry,計算當前位的和 sum
  3. 進位處理carry = sum / 10 用于更新進位,sum = sum % 10 用于獲取當前位的值。
  4. 鏈表遍歷:通過 l1l2 的指針移動,逐位處理兩個鏈表。
  5. 最終進位:如果最后還有進位,需要在結果鏈表末尾添加一個新節點。

注意事項

  1. 鏈表為空的處理:在計算 n1n2 時,需要判斷鏈表是否為空,避免訪問空指針。
  2. 內存管理:每次創建新節點時,需要使用 malloc 分配內存,并確保在程序結束時釋放內存(如果需要)。

示例運行

以示例 1 為例:

  • 輸入:l1 = [2,4,3]l2 = [5,6,4]
  • 計算過程:
    • 第一位:2 + 5 = 7,無進位,結果鏈表為 [7]
    • 第二位:4 + 6 = 10,進位為 1,當前位為 0,結果鏈表為 [7,0]
    • 第三位:3 + 4 + 1 = 8,無進位,結果鏈表為 [7,0,8]
  • 輸出:[7,0,8]

總結

本題考察了鏈表的操作和進位處理。通過創建虛擬頭節點和逐位相加的方式,可以高效地解決該問題。時間復雜度為 O(max(n, m)),其中 n 和 m 分別為兩個鏈表的長度。
最開始我還以為是正常的相加呢,那不得麻煩死,還得反轉列表。結果不需要,直接加就好,一下子容易太多了。另外學會了如何新建一個結點, struct ListNode* dummy = (struct ListNode*)malloc(sizeof(struct ListNode));我就一直想為什么(ListNode*)malloc(sizeof(struct ListNode));為什么不對,原來是設置的就有問題。在代碼中,dummy 和 current 的類型聲明為 struct ListNode*,但在 malloc 和類型轉換時,使用了 (ListNode*),這可能會導致編譯錯誤。正確的類型轉換應該是 (struct ListNode*)。

在C語言中,malloc 返回的是 void* 類型。雖然在某些編譯器中,顯式類型轉換是允許的,但嚴格來說,這種轉換是不必要的。如果你的編譯器支持,可以去掉類型轉換。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/73058.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/73058.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/73058.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

制作自定義鏡像

1. 確定軟件包 確定自己的環境都需要哪些命令&#xff0c;然后&#xff0c;從鏡像文件或者yum源下載響應的安裝包。 bash基本是必選的 &#xff08;bash-5.1.8-10.oe2203sp2.aarch64.rpm&#xff09; vim也是有必要的 &#xff08;vim-enhanced-9.0-15.oe2203sp2.aarch64.rpm…

WHAT - 前端性能指標

目錄 核心 Web Vitals&#xff08;Core Web Vitals&#xff09;加載性能指標網絡相關指標交互和響應性能指標內存與效率指標推薦的監控工具優化策略與建議推薦學習路線 作為前端開發者&#xff0c;理解并掌握關鍵的性能指標對優化 Web 應用至關重要。 以下是前端性能優化中常見…

C++20 模塊:告別頭文件,迎接現代化的模塊系統

文章目錄 引言一、C20模塊簡介1.1 傳統頭文件的局限性1.2 模塊的出現 二、模塊的基本概念2.1 模塊聲明2.2 模塊接口單元2.3 模塊實現單元 三、模塊的優勢3.1 編譯時間大幅減少3.2 更好的依賴管理3.3 命名空間隔離 四、如何使用C20模塊4.1 編譯器支持4.2 示例項目4.3 編譯和運行…

Apache Hudi 性能測試報告

一、測試背景 數據湖作為一個集中化的數據存儲倉庫,支持結構化、半結構化以及非結構化等多種數據格式,數據來源包含數據庫數據、增量數據、日志數據以及數倉上的存量數據等。數據湖能夠將這些不同來源、不同格式的數據集中存儲和管理在高性價比的分布式存儲系統中,對外提供…

sql靶場5-6關(報錯注入)保姆級教程

目錄 sql靶場5-6關&#xff08;報錯注入&#xff09;保姆級教程 1.第五關 1.步驟一&#xff08;閉合&#xff09; 2.步驟二&#xff08;列數&#xff09; 3.報錯注入深解 4.報錯注入格式 5.步驟三&#xff08;數據庫表名&#xff09; 6.常用函數 7.步驟四&#xff08;表…

OSPF-單區域的配置

一、單區域概念&#xff1a; 單區域OSPF中&#xff0c;整個網絡被視為一個區域&#xff0c;區域ID通常為0&#xff08;骨干區域&#xff09;。所有的路由器都在這個區域內交換鏈路狀態信息。 補充知識點&#xff1a; OSPF為何需要loopback接口&#xff1a; 1.Loopback接口的…

LeetCode100之二叉樹的直徑(543)--Java

1.問題描述 給你一棵二叉樹的根節點&#xff0c;返回該樹的 直徑 。 二叉樹的 直徑 是指樹中任意兩個節點之間最長路徑的 長度 。這條路徑可能經過也可能不經過根節點 root 。 兩節點之間路徑的 長度 由它們之間邊數表示。 示例1 輸入&#xff1a;root [1,2,3,4,5] 輸出&#…

C語言每日一練——day_4

引言 針對初學者&#xff0c;每日練習幾個題&#xff0c;快速上手C語言。第四天。&#xff08;連續更新中&#xff09; 采用在線OJ的形式 什么是在線OJ&#xff1f; 在線判題系統&#xff08;英語&#xff1a;Online Judge&#xff0c;縮寫OJ&#xff09;是一種在編程競賽中用…

工作流編排利器:Prefect 全流程解析

工作流編排利器&#xff1a;Prefect 全流程解析 本文系統講解了Prefect工作流編排工具&#xff0c;從基礎入門到高級應用&#xff0c;涵蓋任務與流程管理、數據處理、執行器配置、監控調試、性能優化及與其他工具集成等內容&#xff0c;文末項目實戰示例&#xff0c;幫助讀者全…

Web Workers 客戶端 + 服務端應用

一. Web Workers 客戶端應用 使用 JavaScript 創建 Web Worker 的步驟如下&#xff1a; 1.創建一個新的 JavaScript 文件&#xff0c;其中包含要在工作線程中運行的代碼&#xff08;耗時任務&#xff09;。該文件不應包含對 DOM 的引用&#xff0c;因為在工作線程中無法訪問 …

大模型工具Ollama存在安全風險

國家網絡安全通報中心&#xff1a;大模型工具Ollama存在安全風險 來源&#xff1a;國家網絡與信息安全信息通報中心 3月3日&#xff0c;國家網絡安全通報中心發布關于大模型工具Ollama存在安全風險的情況通報&#xff0c;內容如下&#xff1a; 據清華大學網絡空間測繪聯合研…

LINUX系統安裝+添加共享目錄

一、前言 Windows或mac系統中創建Linux工作環境是基于VMware和SL(Scientific Linux)&#xff0c;下面分別安裝二者。 二、VMware軟件安裝及注冊 1、雙擊VMware安裝包 2、點擊下一步 3、 勾選接受許可&#xff0c;并點擊下一步 4、更改路徑&#xff08;建議更改為容易找到的路…

BI 工具響應慢?可能是 OLAP 層拖了后腿

在數據驅動決策的時代&#xff0c;BI 已成為企業洞察業務、輔助決策的必備工具。然而&#xff0c;隨著數據量激增和分析需求復雜化&#xff0c;BI 系統“卡”、“響應慢”的問題日益突出&#xff0c;嚴重影響分析效率和用戶體驗。 本文將深入 BI 性能問題的根源&#xff0c;并…

基于SSM+Vue的汽車維修保養預約系統+LW示例

1.項目介紹 系統角色&#xff1a;管理員、員工、用戶功能模塊&#xff1a;用戶管理、員工管理、汽車類型管理、項目類型管理、維修/預約訂單管理、系統管理、公告管理等技術選型&#xff1a;SSM&#xff0c;vue&#xff08;后端管理web&#xff09;&#xff0c;Layui&#xff…

在rocklinux里面批量部署安裝rocklinx9

部署三臺Rockylinux9服務器 實驗要求 1. 自動安裝ubuntu server20以上版本 2. 自動部署三臺Rockylinux9服務器&#xff0c;最小化安裝&#xff0c;安裝基礎包&#xff0c;并設定國內源&#xff0c;設靜態IP 實驗步驟 安裝軟件 # yum源必須有epel源 # dnf install -y epel-re…

Oxidized收集H3C交換機網絡配置報錯,not matching configured prompt (?-mix:^(<CD>)$)

背景&#xff1a;問題如上標題&#xff0c;H3C所有交換機配置的model都是comware 解決方案&#xff1a; 1、找到compare.rb [rootoxidized model]# pwd /usr/local/lib/ruby/gems/3.1.0/gems/oxidized-0.29.1/lib/oxidized/model [rootoxidized model]# ll comware.rb -rw-r--…

mac本地安裝運行Redis-單機

記錄一下我以前用的連接服務器的跨平臺SSH客戶端。 因為還要準備畢設...... 服務器又過期了&#xff0c;只能把redis安裝下載到本地了。 目錄 1.github下載Redis 2.安裝homebrew 3.更新GCC 4.自行安裝Redis 5.通過 Homebrew 安裝 Redis 安裝地址&#xff1a;https://git…

C++學習之格斗小游戲綜合案例

C格斗游戲效果視頻 1.案例簡介 #include "broadSword.h" //構造函數 BroadSword::BroadSword() { FileManager fm; map<string, map<string, string>> mWeapon; fm.loadCSVData("Weapons.csv", mWeapon); //武器id string id …

《用Python+PyGame開發雙人生存游戲!源碼解析+完整開發思路分享》

導語? "你是否想過用Python開發一款可玩性高的雙人合作游戲&#xff1f;本文將分享如何從零開始實現一款類《吸血鬼幸存者》的生存射擊游戲&#xff01;包含完整源碼解析、角色系統設計、敵人AI邏輯等核心技術點&#xff0c;文末提供完整代碼包下載&#xff01;" 哈…

【理想解法學習筆記】

目錄 理想解法原理簡介算法步驟屬性值規范化方法代碼示例 理想解法 原理簡介 TOPSIS(Technique for Order Preference by Simi larity to IdealSolution)法是一種逼近理想解的排序方法。其基本的處理思路是&#xff1a;首先建立初始化決策矩陣&#xff0c;而后基于規范化后的初…