【鏈表】Add Two Numbers

題目:

You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

Input:?(2 -> 4 -> 3) + (5 -> 6 -> 4)
Output:?7 -> 0 -> 8

思路:

從左到右相加,記錄進位值。

注意:兩個鏈表不同長度,及鏈表相加后也要檢驗進位是否為0。

/*** Definition for singly-linked list.* function ListNode(val) {*     this.val = val;*     this.next = null;* }*/
/*** @param {ListNode} l1* @param {ListNode} l2* @return {ListNode}*/
var addTwoNumbers = function(l1, l2) {var carrybit=0,tempHead=new ListNode(0);var p=tempHead;while(l1&&l2){l1.val+=l2.val+carrybit;carrybit=l1.val/10;l1.val=l1.val%10;p.next=l1;p=p.next;l1=l1.next;l2=l2.next;}var lp=(l1==null?l2:l1);while(lp){if(carrybit==0){p.next=lp;break;}else{lp.val+=carrybit;carrybit=lp.val/10;lp.val=lp.val%10;p.next=lp;p=p.next;}lp=lp.next;}if(carrybit!=0){p.next=new ListNode(carrybit);}return tempHead.next;
};

?

如果鏈表存儲整數時,高位在前,該如何處理。

1、最簡單的想法是,可以先把鏈表反轉,然后調用上面的算法,最后把結果反轉。

2、可不可以從高位向低位方向處理呢?我們知道進位是從低位傳向高位的,如果從高位向低位方向計算,當計算到某一位需要進位時,有沒有辦法知道該進位傳遞到前面的哪一位呢?從以下幾個例子來看:

image

從最高位到最低位我們依次記為第 1,2…,7位。圖中紅色標記的位置是:下一次需要進位時,進位的1放置的位子

第1位相加,結果為12,需要進位,這個進位放到第0位;同時標記第1位為下一次的進位標志

第2位相加,結果為3,不需要進位;標記第2位為下一次進位標志

第3位相加,結果為3,不需要進位;標記第3位為下一次進位標志

第4位相加,結果為9,不需要進位;此時進位標志不需要移動,因為9加上一個進位后還要繼續向前進位

第5位相加,結果為9,不需要進位;此時進位標志不需要移動,因為9加上一個進位后還要繼續向前進位

第6位相加,結果為14,需要進位,這個進位放到前面標記的第3位上,同時把第4位和第5位置0,標記第6位為下一次進位標志

第7位同上

?

所以綜上所述,從高位往低位計算加法時,規則是:

一、如果當前位沒有進位:(1)如果當前位的和小于9,則把改位設置成下一次進位標志(2)如果和等于9,進位標志不變

二、如果當前位有進位:把進位的1加到前面標志的位子上,同時把標志位和當前位之間的位全部置0(因為他們之間的位肯定全部都是9),把當前位設置成進位標志

?

上面我們舉例的兩個加數長度一致,如果長度不相同,則要先處理較長的整數的前面多出的部分。

?

我們把這一題leetcode的輸入反轉,測試代碼如下:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) {l1 = reverseList(l1);l2 = reverseList(l2);int n1 = lenList(l1), n2 = lenList(l2);if(n1 < n2)//l1 指向較長的鏈表
        {swap(n1,n2);swap(l1,l2);}//carryLoc是下一次出現進位時,進位的1將要放置的位子,pre指向當前結果鏈表的最后一個節點//p1,p2分別是當前處理的l1,l2節點//由于加數的最高位有可能進位,所以添加一個新的節點newHeadListNode *newHead = new ListNode(0), *carryLoc = newHead, *pre = newHead, *p1 = l1;for(int i = 0; i < n1-n2; i++)//處理l1高位長出的部分
        {if(p1->val < 9)carryLoc = p1;pre->next = p1;pre = p1;p1 = p1->next;}ListNode* p2 = l2;while(p1 != NULL){pre->next = p1;pre = p1;p1->val += p2->val;if(p1->val > 9){carryLoc->val += 1;for(carryLoc = carryLoc->next; carryLoc != p1; carryLoc = carryLoc->next)//carryLoc到p1之間的節點全部置0carryLoc->val = 0;p1->val -= 10;}if(p1->val < 9)carryLoc = p1;p1 = p1->next;p2 = p2->next;}if(newHead->val != 0)return reverseList(newHead);else return reverseList(newHead->next);}//反轉鏈表ListNode *reverseList(ListNode *l1){ListNode *p = l1->next, *pre = l1;l1->next = NULL;while(p){ListNode *tmp = p->next;p->next = pre;pre = p;p = tmp;}return pre;}//求鏈表長度int lenList(ListNode *head){int res = 0;while(head){res++;head = head->next;}return res;}
};

?

后面轉載自:http://www.cnblogs.com/TenosDoIt/p/3735362.html

轉載于:https://www.cnblogs.com/shytong/p/5146886.html

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

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

相關文章

我們為何要使用多線程,它有什么優點?

其實在平時的開發中&#xff0c;很多程序員都不會去寫線程&#xff0c;為啥&#xff1f;因為麻煩&#xff0c;其次是用到的地方并不多&#xff0c;除非逼不得已&#xff0c;大家都不會去寫&#xff0c;畢竟寫一天代碼&#xff0c;拿一天工資&#xff0c;是吧&#xff1f; 麻煩歸…

ecs服務器數據遷移_如何非常方便地從Windows文件服務器把數據完整地遷移到ONTAP Select...

這是一個續篇&#xff0c;如果你依然愛你的Windows文件服務器或者使用Windows文件服務沒有任何問題的話&#xff0c;請忽略我。續自&#xff1a;從Windows文件服務器&#xff0c;到ONTAP Select軟件定義存儲感謝聯想凌拓合作伙伴新銳英誠的幫助&#xff0c;我們成功地做到了從海…

yum第三方安裝-軟件包沒簽名及更新錯誤

yum安裝時 后面加 --nogpgcheck 阿里云源文件&#xff1a;http://mirrors.aliyun.com/repo/Centos-7.repo epel repo源&#xff1a;http://mirrors.aliyun.com/repo/epel-7.repo yum update 錯誤提示 Error: initscripts conflicts with centos-release-7-4.1708.el7.centos.x8…

oracle觸發和存儲過程,Oracle存儲過程與觸發器

Oracle存儲過程與觸發器存儲過程存儲過程最直接的理解&#xff1a;就是保存了批量的sql(select,insert,if for)&#xff0c;以后可以通過一個名字把這些批量的sql執行&#xff0c;使用存儲過程在大批量數據查詢或計算時會帶來高性能&#xff0c;存儲過程編寫和調試比較復雜&…

(hdu 簡單題 128道)平方和與立方和(求一個區間的立方和和平方和)

題目&#xff1a;平方和與立方和Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 108212 Accepted Submission(s): 34915Problem Description給定一段連續的整數。求出他們中全部偶數的平方和以及全部奇數的立方…

企業高可用切換的說明

企業的應用場景&#xff0c;基本上都離不開高可用&#xff0c;不管是windows下自帶的集群軟件&#xff0c;或者是Linux下的heartbeat&#xff0c;keepalived等&#xff0c;AIX下的hacmp等。-----------------------------引用老男孩老師對高可用切換的說明--------------------…

swift int轉string_Swift集合類型協議淺析(下)

關注【搜狐技術產品】公眾號&#xff0c;第一時間獲取技術干貨導讀本篇是Swift集合類型協議淺析系列文章的下篇&#xff0c;在這篇文章中&#xff0c;我們將繼續圍繞集合類型協議展開討論&#xff0c;側重點更多地關注于String相關的周邊協議。StringProtocol代表一個字符串&am…

50 jQuery綁定事件 阻止默認事件發生 內置動畫 each data

主要內容 1 阻止后續事件繼續執行 return false: 常用于表單提交 event.preventDefault : 阻止默認事件發生 <body> <form action""><input type"text" id"t1"><input type"submit" class"s1" id&qu…

oracle視圖執行腳本,Sh腳本中查詢Oracle v$視圖時需要在$號前加轉義符“\”

DBA經常會部署一些sh腳本登陸Oracle數據庫查詢v$動態視圖得到一些東西來實際管理自動化的目的&#xff0c;但在sh腳本中寫ORACLE SQL語句時&#xff0c;如果語句查詢v$視圖&#xff0c;直接寫v$XXXX是不能成功的&#xff0c;shell會將$當成一個參數來處理。以下面一段簡單的sh腳…

Linux下實現視頻讀取(二)---camera參數設定

Camera的可設置項極多&#xff0c;V4L2 支持了不少。但Sam之前對這些設置的使用方法和涵義都是在看videodev2.h中邊看邊理解。感覺很生澀。直到寫這篇blog時&#xff0c;才發現v4l2有專門的SPEC來說明&#xff1a; http://www.linuxtv.org/downloads/legacy/video4linux/API/V4…

微信小程序頁面跳轉與返回并回傳數據

2019獨角獸企業重金招聘Python工程師標準>>> A頁面&#xff1a; .wxml文件 <view class"flex-wrp"><text style"width: 32%;">選擇城市</text><input style"width: 68%;" type"text" bindtap"ci…

地址欄 輸入 參數 刷新參數丟失_小米11 Pro屏幕參數曝光:2K屏幕+120Hz刷新率

本周一&#xff0c;高通已經宣布將于12月初舉行的驍龍技術峰會上正式發布新一代旗艦處理器——驍龍875。根據此前的曝光消息&#xff0c;小米11系列將首發搭載這顆芯片&#xff0c;網上也已經開始對這款新機進行曝光。日前&#xff0c;海外知名論壇XDA在MIUI 12的代碼中發現了一…

Cypress EZ-USB FX3 DMA模式下的串口通訊

由于公司設備升級后出了問題&#xff0c;需要對USB驅動進行修改&#xff0c;原本使用的是寄存器模式進行UART傳輸&#xff0c;但是由于FX3寄存器模式會出現長時間延時等待的問題&#xff0c;不得不對其傳輸模式進行修改。雖然賽普拉斯的EZ-USB FX3系列芯片功能強大&#xff0c;…

php如何寫一個能讓外部訪問的接口,如何寫一個接口供外界訪問

在工作的時候經常調用別人的接口&#xff0c;獲取數據&#xff0c;然后就想知道這中間的原理是什么呢&#xff1f;今天上一個自己寫的一個測試例子&#xff1a;首先是自己遠程寫好的一個接口&#xff1a;public function testming(){$arrarray(first > 1,hospitalname > …

win10遠程桌面連接

有的情況下&#xff0c;Win10設置了允許遠程桌面連接后&#xff0c;遠程主機仍然不能桌面連接到目標主機上&#xff0c;這時可以在目標主機上嘗試如下修改&#xff1a; 開始-->運行->gpedit.msc->計算機配置->Windows設置->安全設置->本地策略->安全選項-…

10494,沒過,待解決,大數除法

10494,沒過,待解決,大數除法 import java.io.*; import java.util.*;public class Main {public static void main(String[] args) throws FileNotFoundException{// Scanner scanner new Scanner(new File("d://1.txt"));Scanner scanner new Scanner(System.in);…

springboot md5加密_實在!基于Springboot和WebScoket,寫了一個在線聊天小程序

基于Springboot和WebScoket寫的一個在線聊天小程序(好幾天沒有寫東西了&#xff0c;也沒有去練手了&#xff0c;就看了看這個。。。)項目說明此項目為一個聊天的小demo&#xff0c;采用springbootwebsocketvue開發。其中有一個接口為添加好友接口&#xff0c;添加好友會判斷是否…

suse 啟動oracle11g,SuSe10下Oracle11g文件系統模式安裝及配置、網絡配置與連接

SuSe10下Oracle11g文件系統模式安裝及配置、網絡配置與連接概述本課程主要講解oracle數據庫軟件的安裝及配置&#xff0c;以及數據庫的創建過程和網絡配置與連接等&#xff1b;同時講解一些數據庫安裝過程中的常見問題解決辦法。注意&#xff1a;本文當中引用的package_name均為…

Python pyenv

一、簡介 一般在操作系統中我們會安裝多個Python版本&#xff0c;所以在進行Python版本切換時會比較麻煩&#xff0c;pyenv就提供了一種簡單的方式&#xff0c;能簡易地在多個Python版本中進行切換的工具&#xff0c;它簡單而優雅。pyenv有以下功能&#xff1a; 1&#xff09;進…

python中add_Python add()函數是如何使用呢?

Python里經常會出現一些不太常見的函數&#xff0c;大家在遇到這類函數時候&#xff0c;是怎么做的呢&#xff1f;沒有概念&#xff0c;直接過&#xff0c;還是會去查詢下呢&#xff1f;相信大部分人都不會去查詢&#xff0c;因為查詢的內容太復雜了&#xff0c;所以&#xff0…