成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

動畫圖解“兩數相加”,小學生都能看懂

運維 數據庫運維
大家好,我是來自于華為的程序員小熊。今天給大家帶來一道各互聯網大廠面試中常考的涉及到鏈表相關的中檔題題,即力扣上的第 2 題-兩數相加。

[[420833]]

本文轉載自微信公眾號「程序員小熊」,作者Dine。轉載本文請聯系程序員小熊公眾號。

前言

大家好,我是來自于華為的程序員小熊。今天給大家帶來一道各互聯網大廠面試中常考的涉及到鏈表相關的中檔題題,即力扣上的第 2 題-兩數相加。

本文主要介紹迭代+虛擬頭節點的策略來解答此題,供大家參考,希望對大家有所幫助。

兩數相加

給你兩個非空的鏈表,表示兩個非負的整數。

它們每位數字都是按照逆序的方式存儲的,并且每個節點只能存儲一位數字。

請你將兩個數相加,并以相同形式返回一個表示和的鏈表。

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

示例1

其它示例及提示

解題思路

由于題目已明確告知每個節點只能存儲一位數字,因此當兩鏈表相同位置的數字之和大于 10 時,需要考慮進位的問題。

例兩個鏈表:l1 = [3,4,3], l2 = [5,6,4]。

當他們的第二個節點的數字相加時,需要進位 1 到第三個節點的數字之和。

由于需要遍歷一遍兩個鏈表,所以考慮采用迭代的思想。

注意點

1.考慮中間位進位的問題;

例如 l1 = [3,4,3], l2 = [5,6,4]。

2.考慮最高位進位的問題。

例如 l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]。

舉栗

以 l1 = [3,4,3], l2 = [5,6,4] 為例子,如下圖示:

示例

不斷遍歷兩個鏈表,將相同位置的節點的數值相加,并更新到新的鏈表;

相同位置的節點的數值相加并更新

遇到需要進位時,保留需要進位的值;

需要進位時,先保留進位

將上次進位的值與兩鏈表本次節點的和相加;

進位更新

完整的處理過程,如下動圖示:

兩鏈表節點值相加更新到新鏈表,完整處理過程

Show me the Code

「C」

  1. struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){ 
  2.     struct ListNode *dummyHead = (struct ListNode*)malloc(sizeof(struct ListNode)); 
  3.     dummyHead->val = 0; 
  4.     dummyHead->next = NULL
  5.     struct ListNode *node = dummyHead; 
  6.     int carry = 0;  //  進位 
  7.  
  8.     /* 遍歷兩個鏈表 */ 
  9.     for (struct ListNode* p = l1, *q = l2; p != NULL || q != NULL;) { 
  10.         /* 相同位置節點值之和 */ 
  11.         int sum = carry; 
  12.         sum += (p != NULL) ? p->val : 0; 
  13.         sum += (q != NULL) ? q->val : 0; 
  14.          
  15.         /* 將兩鏈表相同位置的和的值,不斷更新到新的鏈表 */ 
  16.         node->next = (struct ListNode*)malloc(sizeof(struct ListNode)); 
  17.         node = node->next
  18.         node->val = sum % 10; 
  19.         node->next = NULL
  20.  
  21.         /* 進位處理,兩鏈表不斷遍歷 */ 
  22.         carry = sum / 10; 
  23.         p = (p == NULL) ? p : p->next
  24.         q = (q == NULL) ? q : q->next
  25.     } 
  26.  
  27.     /* 最高位之和如果大于 10,增加一位,新鏈表的節點值為 1 */ 
  28.     if(carry != 0) { 
  29.         node->next = (struct ListNode*)malloc(sizeof(struct ListNode)); 
  30.         node = node->next
  31.         node->val = 1; 
  32.         node->next = NULL
  33.     } 
  34.  
  35.     return dummyHead->next

「C++」

  1. ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { 
  2.     ListNode* dummyHead = new ListNode(0);   
  3.     ListNode* node = dummyHead; 
  4.  
  5.     int carry = 0; 
  6.     for (ListNode* p = l1, *q = l2; p != nullptr || q != nullptr;) { 
  7.         int sum = carry; 
  8.         sum += (p == nullptr) ? 0 : p->val; 
  9.         sum += (q == nullptr) ? 0 : q->val; 
  10.  
  11.         node->next = new ListNode(sum % 10); 
  12.         node = node->next
  13.  
  14.         carry = sum / 10; 
  15.         p = (p == nullptr) ? p : p->next
  16.         q = (q == nullptr) ? q : q->next
  17.     } 
  18.  
  19.     if (carry != 0) { 
  20.         node->next = new ListNode(carry); 
  21.     } 
  22.  
  23.     return dummyHead->next

「Java」

  1. ListNode addTwoNumbers(ListNode l1, ListNode l2) { 
  2.     ListNode dummyHead = new ListNode(-1); 
  3.     ListNode cur = dummyHead; 
  4.  
  5.     int carry = 0; 
  6.     while (l1 != null || l2 != null) { 
  7.         int sum = carry; 
  8.         sum += (l1 == null) ? 0 : l1.val; 
  9.         sum += (l2 == null) ? 0 : l2.val; 
  10.  
  11.         cur.next = new ListNode(sum % 10); 
  12.         cur = cur.next
  13.  
  14.         carry = sum / 10; 
  15.         l1 = (l1 == null) ? l1 : l1.next
  16.         l2 = (l2 == null) ? l2 : l2.next
  17.     } 
  18.  
  19.     if (carry != 0) { 
  20.         cur.next = new ListNode(carry); 
  21.     } 
  22.  
  23.     return dummyHead.next

「Python3」

  1. def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode: 
  2.     dummyHead = ListNode(0) 
  3.     node = dummyHead 
  4.     carry = 0 
  5.  
  6.     while(l1 or l2): 
  7.         sum = carry 
  8.         if(l1): 
  9.             sum += l1.val                 
  10.             l1 = l1.next                 
  11.         if l2: 
  12.             sum += l2.val 
  13.             l2 = l2.next 
  14.  
  15.         node.next = ListNode(sum % 10) 
  16.         node = node.next 
  17.         carry = sum//10 
  18.  
  19.     if carry != 0: 
  20.         node.next = ListNode(carry) 
  21.  
  22.     return dummyHead.next   

「Golang」

  1. func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode { 
  2.     dummy := new(ListNode) 
  3.     node := dummy 
  4.     carry := 0 
  5.     for l1 != nil || l2 != nil { 
  6.         sum := carry 
  7.         if l1 != nil { 
  8.             sum += l1.Val 
  9.             l1 = l1.Next 
  10.         } 
  11.  
  12.         if l2 != nil { 
  13.             sum += l2.Val 
  14.             l2 = l2.Next 
  15.         } 
  16.  
  17.         node.Next = new(ListNode) 
  18.         node = node.Next 
  19.         node.Val = sum % 10 
  20.  
  21.         carry = sum / 10 
  22.     } 
  23.      
  24.     if carry != 0 { 
  25.         node.Next = &ListNode{Val: carry} 
  26.     } 
  27.  
  28.     return dummy.Next 

復雜度分析

時間復雜度:O(max(m, n)),其中 m 和 n 分別為兩個鏈表的長度,需要遞歸調用兩個鏈表的每個節點一次。

空間復雜度:O(1),未開辟額外存儲空間。

 

責任編輯:武曉燕 來源: 程序員小熊
相關推薦

2021-01-22 09:39:54

人工智能人工智能技術

2019-12-27 09:47:05

大數據TomcatWeb

2022-07-04 08:31:42

GitOpsGit基礎設施

2019-10-08 10:10:52

中臺 IT后臺

2020-01-21 10:16:15

Kubernetes教程容器

2020-12-01 09:03:22

分庫分表MySQL

2018-11-21 09:40:57

熔斷實踐AOP

2018-11-21 15:40:08

HTTP協議前端

2019-10-21 08:22:36

豐巢刷臉取件

2025-06-12 09:23:08

網絡AP網絡協議

2020-09-28 14:25:39

HTTPS加密算法

2020-06-22 08:07:48

Spring依賴場景

2021-09-27 13:50:13

Python裝飾器函數

2019-09-05 11:14:12

監控系統拓撲圖

2017-12-20 10:08:53

2023-01-26 00:22:01

分布式架構大文件

2019-01-22 09:37:47

紅黑樹數據二叉樹

2020-08-06 13:48:16

Python 開發編程語言

2018-05-24 22:58:26

大數據分布式計算統計

2020-09-08 06:30:59

微服務代碼模塊
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人一区二 | 五月天天色 | 亚洲免费一区二区 | 成人亚洲综合 | 成人免费视频在线观看 | 亚洲精品久久久久中文字幕二区 | 亚洲欧美精品国产一级在线 | 国产午夜精品久久久 | 日日干日日操 | 久草免费在线视频 | 一区欧美 | 精品国产亚洲一区二区三区大结局 | 三级在线视频 | 日韩三级 | 在线国产一区二区 | 国产成人小视频 | 日韩中文字幕在线观看 | 国产99精品 | 黄网站涩免费蜜桃网站 | 久久久久久综合 | 日韩av一区二区在线观看 | 国产精品久久久久久久久久免费看 | 一级毛片免费看 | 亚洲综合色视频在线观看 | 欧美xxxx做受欧美 | 欧美一区在线视频 | 操久久| 国产成人精品一区二区三区网站观看 | 91九色视频 | 国产精品xxxx | 成人国产一区二区三区精品麻豆 | 精品二区 | 日韩国产一区二区三区 | 在线永久看片免费的视频 | 国产资源在线观看 | 久久久国产精品 | 天天艹逼网 | 91精品久久久久久久久中文字幕 | 婷婷久 | 亚洲激情综合网 | 中文字幕日韩一区 |