LEETCODE學習 2 兩數之和

2021-10-23 04:41:14 字數 1928 閱讀 7133

給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。

如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。

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

示例:

輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)

輸出:7 -> 0 -> 8

原因:342 + 465 = 807

思路較為清晰,兩個鍊錶相加,數字順序是大尾端,也就是從鍊錶的頭開始進行加法運算即可,進製用乙個int型變數作為快取,等到進入下乙個迴圈中加入到求和中即可。

此處對鍊錶的遍歷有兩個問題:

不知道l1與l2哪個較長

提前設定好輸出鍊錶的大小會帶來記憶體溢位問題

問題1的解決,我們採用while(p!=null||q!=null)的寫法,這樣可以一直遍歷到最長鍊錶的尾部,並且在進行鍊錶向下轉移的判斷條件是p->next != null

問題2的解決,採用遍歷鍊錶的同時分配新的記憶體空間。在每個迴圈內部,使用cur->next = (struct listnode*)malloc(sizeof(struct listnode))的寫法。

另外需要注意的是,會出現最後生成的鍊錶長度大於原先任一鍊錶的情況,此時需要考慮最後乙個結點的處理邏輯。

note: the returned array must be malloced, assume caller calls free().

struct listnode*

addtwonumbers

(struct listnode* l1,

struct listnode* l2)

if(flag >0)

else

return head;

}

方法一的複雜度在於,要想得知外層迴圈當前所在的數字是否為滿足和要求的數字,需要將其後的所有數字都查詢一遍,複雜度為o(n^2)。引入雜湊表的思路是可以直接找到需要的數字是否在陣列中,可以將複雜度降至o(n)。

雜湊表的構建:

將hash[max_size]的每一項初始化為-1

對nums陣列進行遍歷,假設當前物件為nums[i]

檢視hash[nums[i]],如果該項的值為-1,就將其替換為i 例:

nums陣列:[2 , 4 , 6 , 7]

nums下標: 0 1 2 3

hash表:[ -1,-1,0, -1, 1,-1, 2, 3,…]

hash下標:0 1 2 3 4 5 6 7

由此得到的hash表,可以作為第二個和因子的查詢表。這樣在外層迴圈當前指向nums[i]時,只需要查詢hash[target - nums[i]]的值,如果為-1說明target - nums[i]在陣列中不存在,如果為自然數則為target - nums[i]在陣列中的位置。

另外需要注意的是,可能會出現負數,對於負數的操作則補充到hash表的隊尾。

int

*twosum

(int

*nums,

int numssize,

int target,

int*returnsize)

hash[

(nums[i]

+2048)%

2048

]= i;

}free

(hash)

;*returnsize =0;

return res;

}

該演算法要求hash表的大小需要足夠大,不能發生正數區和負數區的碰撞。

通過在hash表中增加一項標記,標明每個專案入錶時是正值還是負值可以解決一部分問題。

2 兩數之和 LeetCode

宣告 本文題目來自leetcode 題目 給定乙個整數陣列 nums 和乙個整數目標值 target,請你在該陣列中找出 和為目標值 的那 兩個 整數,並返回它們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,陣列中同乙個元素不能使用兩遍。示例 1 輸入 nums 2,7,11,15 targ...

LeetCode 2 兩數之和

我的思路是,先把每個鍊錶組合成數字,然後把數字相加,這是函式getnum做的事情。然後根據數字建個鍊錶就行了。關鍵就在於如何組合成數字,又如何把數字分解到鍊錶上。不過我的方法並不好。我後面附了好的辦法。別人的方案。definition for singly linked list.class lis...

LeetCode 2 兩數之和

題目 給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,陣列中同乙個元素不能使用兩遍。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nums 1 2 ...