給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。
如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。
示例:思路較為清晰,兩個鍊錶相加,數字順序是大尾端,也就是從鍊錶的頭開始進行加法運算即可,進製用乙個int型變數作為快取,等到進入下乙個迴圈中加入到求和中即可。輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
此處對鍊錶的遍歷有兩個問題:
不知道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 ...