自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

動畫圖解“兩數(shù)相加”,小學(xué)生都能看懂

運(yùn)維 數(shù)據(jù)庫運(yùn)維
大家好,我是來自于華為的程序員小熊。今天給大家?guī)硪坏栏骰ヂ?lián)網(wǎng)大廠面試中常考的涉及到鏈表相關(guān)的中檔題題,即力扣上的第 2 題-兩數(shù)相加。

[[420833]]

本文轉(zhuǎn)載自微信公眾號「程序員小熊」,作者Dine。轉(zhuǎn)載本文請聯(lián)系程序員小熊公眾號。

前言

大家好,我是來自于華為的程序員小熊。今天給大家?guī)硪坏栏骰ヂ?lián)網(wǎng)大廠面試中??嫉纳婕暗芥湵硐嚓P(guān)的中檔題題,即力扣上的第 2 題-兩數(shù)相加。

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

兩數(shù)相加

給你兩個非空的鏈表,表示兩個非負(fù)的整數(shù)。

它們每位數(shù)字都是按照逆序的方式存儲的,并且每個節(jié)點(diǎn)只能存儲一位數(shù)字。

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

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

示例1

其它示例及提示

解題思路

由于題目已明確告知每個節(jié)點(diǎn)只能存儲一位數(shù)字,因此當(dāng)兩鏈表相同位置的數(shù)字之和大于 10 時,需要考慮進(jìn)位的問題。

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

當(dāng)他們的第二個節(jié)點(diǎn)的數(shù)字相加時,需要進(jìn)位 1 到第三個節(jié)點(diǎn)的數(shù)字之和。

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

注意點(diǎn)

1.考慮中間位進(jìn)位的問題;

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

2.考慮最高位進(jìn)位的問題。

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

舉栗

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

示例

不斷遍歷兩個鏈表,將相同位置的節(jié)點(diǎn)的數(shù)值相加,并更新到新的鏈表;

相同位置的節(jié)點(diǎn)的數(shù)值相加并更新

遇到需要進(jìn)位時,保留需要進(jìn)位的值;

需要進(jìn)位時,先保留進(jìn)位

將上次進(jìn)位的值與兩鏈表本次節(jié)點(diǎn)的和相加;

進(jìn)位更新

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

兩鏈表節(jié)點(diǎn)值相加更新到新鏈表,完整處理過程

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;  //  進(jìn)位 
  7.  
  8.     /* 遍歷兩個鏈表 */ 
  9.     for (struct ListNode* p = l1, *q = l2; p != NULL || q != NULL;) { 
  10.         /* 相同位置節(jié)點(diǎn)值之和 */ 
  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.         /* 進(jìn)位處理,兩鏈表不斷遍歷 */ 
  22.         carry = sum / 10; 
  23.         p = (p == NULL) ? p : p->next
  24.         q = (q == NULL) ? q : q->next
  25.     } 
  26.  
  27.     /* 最高位之和如果大于 10,增加一位,新鏈表的節(jié)點(diǎn)值為 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 

復(fù)雜度分析

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

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

 

責(zé)任編輯:武曉燕 來源: 程序員小熊
相關(guān)推薦

2021-01-22 09:39:54

人工智能人工智能技術(shù)

2019-12-27 09:47:05

大數(shù)據(jù)TomcatWeb

2022-07-04 08:31:42

GitOpsGit基礎(chǔ)設(shè)施

2020-01-21 10:16:15

Kubernetes教程容器

2019-10-08 10:10:52

中臺 IT后臺

2020-12-01 09:03:22

分庫分表MySQL

2018-11-21 09:40:57

熔斷實(shí)踐AOP

2018-11-21 15:40:08

HTTP協(xié)議前端

2019-10-21 08:22:36

豐巢刷臉取件

2020-09-28 14:25:39

HTTPS加密算法

2020-06-22 08:07:48

Spring依賴場景

2021-09-27 13:50:13

Python裝飾器函數(shù)

2019-09-05 11:14:12

監(jiān)控系統(tǒng)拓?fù)鋱D

2017-12-20 10:08:53

2019-01-22 09:37:47

紅黑樹數(shù)據(jù)二叉樹

2023-01-26 00:22:01

分布式架構(gòu)大文件

2020-08-06 13:48:16

Python 開發(fā)編程語言

2018-05-24 22:58:26

大數(shù)據(jù)分布式計(jì)算統(tǒng)計(jì)

2020-09-08 06:30:59

微服務(wù)代碼模塊

2018-11-19 08:34:22

Hadoop架構(gòu)HDFS
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號