You are given two non-empty linked lists representing two non-negative integers. 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.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)Output: 7 -> 0 -> 8
Subscribe to see which companies asked this question.
倉鼠翻譯一下題目:給你兩個(gè)非空鏈表,每個(gè)鏈表代表一個(gè)數(shù),把這兩個(gè)數(shù)加起來,返回結(jié)果。結(jié)果也是以鏈表的形式返回。
稍微特殊一點(diǎn)的地方是,給的鏈表是按數(shù)字的每一位倒著給的,比如 123 一百二十三 給的鏈表是 3 -> 2 -> 1
這樣如果輸入 (2 -> 4 -> 3) 和 (5 -> 6 -> 4) 兩個(gè)鏈表,代表 342 和 465,加出來的結(jié)果應(yīng)該是 807,返回的結(jié)果應(yīng)該是 7 -> 0 -> 8
這就是一個(gè)簡單的鏈表節(jié)點(diǎn)的定義。包含兩部分:
next 是一個(gè)鉤子,鉤住鏈表里的下一個(gè)節(jié)點(diǎn),所以我們能從每個(gè)節(jié)點(diǎn)順到下一個(gè)節(jié)點(diǎn)。value 是節(jié)點(diǎn)要存的值,什么都可以,我們現(xiàn)在用一個(gè) int 作為例子。
節(jié)點(diǎn)當(dāng)然不帶頭結(jié)點(diǎn),鏈表才帶頭結(jié)點(diǎn)呀。
所以大家知道鏈表是什么了嘛?鏈表就是一系列這樣的節(jié)點(diǎn),第一個(gè)連著第二個(gè),第二個(gè)連這第三個(gè)…… 這樣。第一個(gè)節(jié)點(diǎn)稱為頭結(jié)點(diǎn),最后一個(gè)節(jié)點(diǎn)稱為尾節(jié)點(diǎn)
繼續(xù)講鏈表哈。我們跟數(shù)組來對比一下。數(shù)組是內(nèi)存里一段連續(xù)的空間,第一個(gè)元素挨著第二個(gè)元素,第二個(gè)元素挨著第三個(gè)元素…… 而鏈表在內(nèi)存里可能是不連續(xù)的,第一個(gè)節(jié)點(diǎn)和第二個(gè)節(jié)點(diǎn)內(nèi)存上并不連續(xù),但是第一個(gè)節(jié)點(diǎn)有個(gè) next 指針指向第二個(gè)節(jié)點(diǎn),第二個(gè)節(jié)點(diǎn)有個(gè) next 指針指向第三個(gè)節(jié)點(diǎn)……
不要被“指針”這倆字嚇到,我發(fā)現(xiàn)很多人都怕這個(gè)詞,但實(shí)際咱們平常寫 OC 的,@property (nonatomic, strong) LinkListNode* next; 這就是一個(gè)指針。就按著一個(gè) property 去理解就好。
好好,接著講:剛才代碼示例了節(jié)點(diǎn)的結(jié)構(gòu),下面來示例一下鏈表的結(jié)構(gòu)。就是記住了倆節(jié)點(diǎn),頭結(jié)點(diǎn)和尾節(jié)點(diǎn)。
有時(shí)候連尾節(jié)點(diǎn)都不給,比如本題,只給了頭結(jié)點(diǎn)。但你通過 next 一路順下去,也能找到尾節(jié)點(diǎn)了。
簡單講一下鏈表怎么操作。插入一個(gè)節(jié)點(diǎn),分為三種情況:最基本的情況,比如之前是 a -> b,要插在 a、b之間,就改成這樣 a->c->b 即可,讓 a.next = c, c.next = b;另外兩種特殊情況,插在頭結(jié)點(diǎn)之前,只需讓 c->a,然后把鏈表的 head 從 a 改成 c;插在尾節(jié)點(diǎn)之后,只需讓 b->c ,然后把鏈表的 tail 從 b 改到 c。
刪除一個(gè)節(jié)點(diǎn),大家可以類推一下……
訪問某個(gè)位置的節(jié)點(diǎn),比如找第 5 個(gè)節(jié)點(diǎn),只能從頭結(jié)點(diǎn)找齊,頭結(jié)點(diǎn)的 next 找第二個(gè)節(jié)點(diǎn),第二個(gè)的 next 找第三個(gè)節(jié)點(diǎn)…… 一直找到第5個(gè)
我們已經(jīng)有了數(shù)組,為啥還要用鏈表呢?我們來對比一下數(shù)組和鏈表的優(yōu)勢和劣勢。數(shù)組的優(yōu)勢是,它的空間是連續(xù)的。所以我可以“隨機(jī)訪問”,比如 我現(xiàn)在就要知道第10個(gè)元素,我可以 array[10],而鏈表就完全不行,像剛才說的,得從頭結(jié)點(diǎn)開始往下順。數(shù)組訪問某個(gè)位置的元素,時(shí)間復(fù)雜度是 O(1) 而鏈表是 O(n)
但數(shù)組也有劣勢,就在于插入和刪除。比如我要?jiǎng)h除數(shù)組第3個(gè)元素,那么第2個(gè)元素和第4個(gè)元素之間就會(huì)出現(xiàn)一個(gè)空檔。數(shù)組的空間是連續(xù)的,為了不讓它出現(xiàn)空檔,我們必須把第4個(gè)元素挪到第3個(gè)元素的位置,第5個(gè)元素挪到第4個(gè)元素的位置…… 一個(gè)一個(gè)往前挪。而鏈表就很輕松,直接把第二個(gè)節(jié)點(diǎn)的 next 指向第四個(gè)節(jié)點(diǎn),第三個(gè)節(jié)點(diǎn)就從鏈表里掉下來啦。
數(shù)組在中間位置插入和刪除,時(shí)間復(fù)雜度是 O(n) 而鏈表是 O(1)
最后一個(gè)next指向NULL