From d72bd072aff9489e3afb08b46ad607cab3b36126 Mon Sep 17 00:00:00 2001 From: yuhuacao Date: Thu, 6 Dec 2018 21:36:42 +0800 Subject: [PATCH 1/5] update --- .../ Maximum Length of Repeated Subarray.py | 36 +++++++++++++++++++ yuhuacao/readme.md | 1 + 2 files changed, 37 insertions(+) create mode 100644 yuhuacao/ Maximum Length of Repeated Subarray.py diff --git a/yuhuacao/ Maximum Length of Repeated Subarray.py b/yuhuacao/ Maximum Length of Repeated Subarray.py new file mode 100644 index 0000000..0a71252 --- /dev/null +++ b/yuhuacao/ Maximum Length of Repeated Subarray.py @@ -0,0 +1,36 @@ +""" +Given two integer arrays A and B, return the maximum length of an subarray that appears in both arrays. + +Example 1: + +Input: +A: [1,2,3,2,1] +B: [3,2,1,4,7] +Output: 3 + +Explanation: +The repeated subarray with maximum length is [3, 2, 1]. + +Note: + 1 <= len(A), len(B) <= 1000 + 0 <= A[i], B[i] < 100 +""" +""" +解体思路:采用动态规划的方法,维护矩阵DP,DP[i][j]代表以A[i-1]与B[j-1]结尾的公共字串的长度,公共字串必须以A[i-1],B[j-1]结束,即当A[i-1] == B[j-1]时,DP[i][j] = DP[i-1][j-1] + 1; 当A[i-1] != B[j-1]时,以A[i-1]和B[j-1]结尾的公共字串长度为0,DP[i][j] = 0。输出最大的公共字串的长度即为最长重复字串。 +""" + +class Solution(object): + def findLength(self, A, B): + """ + :type A: List[int] + :type B: List[int] + :rtype: int + """ + n1,n2 = len(A),len(B) + dp = [[0 for _ in range(n2+1)] for _ in range(n1+1)] + for i in range(1,n1+1): + for j in range(1,n2+1): + if A[i-1] == B[j-1]: + dp[i][j] = dp[i-1][j-1] + 1 + return max(max(row) for row in dp) + diff --git a/yuhuacao/readme.md b/yuhuacao/readme.md index 766f250..882fb90 100644 --- a/yuhuacao/readme.md +++ b/yuhuacao/readme.md @@ -1,3 +1,4 @@ # yuhuacao贡献内容 1. Merge Sorted Array +2. Maximum Length of Repeated Subarray From 9ecd4eccc04e596c8c1930269c7b5d0b8fdd9ef8 Mon Sep 17 00:00:00 2001 From: RIKKA <793160615@qq.com> Date: Thu, 6 Dec 2018 23:08:25 +0800 Subject: [PATCH 2/5] =?UTF-8?q?1206=20=E8=BE=83=E5=A4=A7=E5=88=86=E7=BB=84?= =?UTF-8?q?=E7=9A=84=E4=BD=8D=E7=BD=AE=20=E7=BB=93=E9=A2=98=E6=8A=A5?= =?UTF-8?q?=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\347\232\204\344\275\215\347\275\256.md" | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 "wangggong/\350\276\203\345\244\247\345\210\206\347\273\204\347\232\204\344\275\215\347\275\256.md" diff --git "a/wangggong/\350\276\203\345\244\247\345\210\206\347\273\204\347\232\204\344\275\215\347\275\256.md" "b/wangggong/\350\276\203\345\244\247\345\210\206\347\273\204\347\232\204\344\275\215\347\275\256.md" new file mode 100644 index 0000000..2cdef17 --- /dev/null +++ "b/wangggong/\350\276\203\345\244\247\345\210\206\347\273\204\347\232\204\344\275\215\347\275\256.md" @@ -0,0 +1,71 @@ +[原题戳这里](https://leetcode-cn.com/problems/positions-of-large-groups/description/) + +老实说, 一开始理解错题意了. + +题目是这么说的: + +> 在一个由小写字母构成的字符串 S 中,包含由一些连续的相同字符所构成的分组。 + +> 例如,在字符串 **S = "abbxxxxzyy"** 中,就含有 **"a"**, **"bb"**, **"xxxx"**, **"z"** 和 **"yy"** 这样的一些分组。 + +> 我们称所有包含 **大于或等于三个连续字符** 的分组为较大分组。找到每一个较大分组的起始和终止位置。 + +> 最终结果按照 **字典顺序** 输出。 + +说明很善解人意, *1 <= S.length <= 1000*, 感觉复杂度应该可以到 $O(n^2)$. 虽然犯不上. + +这里我对 "字典顺序" 几个字产生了误解. 举例而言: + +> func("bbbaaa") = ? + +按照我的理解, 输出应该是 **[[3,5],[0,2]]**, 因为按照字符串的大小比较也应该是 *"aaa"* 在 *"bbb"* 前面. 然而... 刚好反过来. + +可见这里所谓的 "字典序"(lexicographic order) 应该说的是结果 **[3,5]** 和 **[0,2]** 的先后顺序. 由于结果代表一个连续的区间, 所以 *a* 在 *b* 前面 <=> *a[0] < b[0]*, *a[1] < b[1]*. + +那就好写了: + +``` +class Solution { + const int NUM_ALPHABETS = 26; + typedef vector> Dvec; + +public: + Dvec largeGroupPositions(string S) { + Dvec res; + int p = 0, q = 0; + while (p < S.size()) { + for (q = p+1; q < S.size() && S[q] == S[p]; q++); + if (q - p >= 3) { + int arr[] = {p, q-1}; + res.push_back(vector(arr, arr+2)); + } + p = q; + } + return res; + } +}; +``` + +不过如果按照我原来的理解应该怎么写呢? 用哈希表就行了. 下面是一个参考: + +``` +Dvec largeGroupPositions(string S) { + vector tmp(NUM_ALPHABETS); + Dvec res; + int p = 0, q = 0; + while (p < S.size()) { + for (q = p + 1; q < S.size() && S[q] == S[p]; q++); + if (3 <= q - p) { + int arr[] = {p, q-1}; + tmp[S[p] - 'a'].push_back(vector(arr, arr + 2)); + }; + p = q; + } + for (int ch = 0; ch < NUM_ALPHABETS; ch++) if (!tmp[ch].empty()) { + for (auto it = tmp[ch].begin(); it != tmp[ch].end(); ++it) { + res.push_back(*it); + } + } + return res; +} +``` From 03cf34126dbadf68d72035121117e10afa8871b9 Mon Sep 17 00:00:00 2001 From: wycgi520 <437891878@qq.com> Date: Fri, 7 Dec 2018 17:04:25 +0800 Subject: [PATCH 3/5] modify --- .../20181207-addTwoNumbers-Archer.py | 147 ++++++++++++++++++ ...16\345\217\212\345\244\215\347\233\230.md" | 13 ++ Archer/readme.md | 8 +- Archer/twoSum/twoSum.py | 22 +-- ...16\345\217\212\345\244\215\347\233\230.md" | 16 ++ 5 files changed, 193 insertions(+), 13 deletions(-) create mode 100644 Archer/addTwoNumbers/20181207-addTwoNumbers-Archer.py create mode 100644 "Archer/addTwoNumbers/addTwoNumbers\350\257\264\346\230\216\345\217\212\345\244\215\347\233\230.md" create mode 100644 "Archer/twoSum/twoSum\350\257\264\346\230\216\345\217\212\345\244\215\347\233\230.md" diff --git a/Archer/addTwoNumbers/20181207-addTwoNumbers-Archer.py b/Archer/addTwoNumbers/20181207-addTwoNumbers-Archer.py new file mode 100644 index 0000000..233f31f --- /dev/null +++ b/Archer/addTwoNumbers/20181207-addTwoNumbers-Archer.py @@ -0,0 +1,147 @@ +#!/usr/bin/env python +# -*- coding:utf-8 -*- + +class Node(object): + """创建节点""" + def __init__(self, elem): + self.elem = elem + self.next = None # 初始设置下一节点为空 + +class Linklist(object): + """节点的一系列操作""" + def __init__(self,node): + self.head = node + + def is_empty(self): #判断节点是否为空 + return self.head == None + + def append(self,item): #在尾部添加节点 + node = Node(item) + if self.is_empty(): + self.head = node + else: + cur = self.head + while cur.next != None: + cur = cur.next + cur.next = node + + def delete(self,item): #删除值为item的节点 + if self.is_empty(): + print "Null" + else: + curNow = self.head + cur = None + while curNow != None: + if curNow.elem == item: + if curNow == self.head: + self.head = curNow.next + else: + cur.next = curNow.next + break + else: + cur = curNow + curNow = curNow.next + + def travel(self): # 遍历节点 + if self.is_empty(): + print "Null" + else: + cur = self.head + while cur != None: + print cur.elem + cur = cur.next + +if __name__ == "__main__": + + a = 619 #加数1 + b = 10 #加数2 + al = Linklist(None) + bl = Linklist(None) + add = Linklist(Node(0)) + + # 将加数1变成逆序链表 + c = a + if c != 0 : + while c != 0: + al.append(c%10) + c /= 10 + else: + al.append(0) + + # 将加数2变成逆序链表 + d = b + if d != 0: + while d != 0: + bl.append(d%10) + d /= 10 + else: + bl.append(0) + + l1 = al.head + l2 = bl.head + la = add.head + + c_l1= l1 + c_l2 = l2 + c_la = la + + ext = 0 #加法中的进位 + + while c_l1 != None or c_l2 != None: + if c_l1 == None: # 如果到了加数1的尾端,则执行以下操作 + while c_l2 != None: + temp = c_l2.elem + ext + if temp/10: + c_la.elem = temp %10 + ext = 1 + else: + c_la.elem = temp + ext = 0 + c_l2 = c_l2.next + c_la.next = Node(0) + c_la = c_la.next + if c_l2 == None : # 如果到了加数2的尾端,则执行以下操作 + while c_l1 != None: + temp = c_l1.elem + ext + if temp/10: + c_la.elem = temp%10 + ext = 1 + else: + c_la.elem = temp + ext = 0 + c_l1 = c_l1.next + c_la.next = Node(0) + c_la = c_la.next + if c_l1 != None and c_l2 != None : # 如果两个加数的链表都还没到尾端,则执行以下操作 + temp = c_l1.elem + c_l2.elem +ext + if temp / 10: + c_la.elem = temp % 10 + ext = 1 + else: + c_la.elem = temp + ext = 0 + c_l1 = c_l1.next + c_l2 = c_l2.next + c_la.next = Node(0) + c_la = c_la.next + + + + if ext == 1: #如果进位为1,则最后应该加上1 + c_la.elem = 1 + + #上面循环加法后,会多出来一个结点,下面删除 + c_la = la + pre_c_la = c_la + while c_la != None: + if c_la.next == None: + if c_la == la: + c_la = None + elif c_la.elem == 0: # 该结点为0才是冗余的,如果不为0,则是为进位的1,不能删除 + pre_c_la.next = None + break + pre_c_la = c_la + c_la = c_la.next + + add.travel() # 遍历加法得到的结果链表 + diff --git "a/Archer/addTwoNumbers/addTwoNumbers\350\257\264\346\230\216\345\217\212\345\244\215\347\233\230.md" "b/Archer/addTwoNumbers/addTwoNumbers\350\257\264\346\230\216\345\217\212\345\244\215\347\233\230.md" new file mode 100644 index 0000000..afd326a --- /dev/null +++ "b/Archer/addTwoNumbers/addTwoNumbers\350\257\264\346\230\216\345\217\212\345\244\215\347\233\230.md" @@ -0,0 +1,13 @@ +# 算法实现:(详细见代码文档) # + +# 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。 # + +#思路# +1.循环从两个逆序列表l1、l2中取出整数相加得到temp(还需要加上进位值ext) +2、判断temp/10,看是否需要进位,如果需要进位,则进位值ext=1,若否,则ext=0,并将temp%10赋值给和值列表la。 +3、当循环到其中一个列表的末尾时,继续循环另一个列表执行第二步,直至完成 + + +# 复盘 # + +应该还可以改进另一种算法,更简洁 \ No newline at end of file diff --git a/Archer/readme.md b/Archer/readme.md index bb0ace8..dcb3732 100644 --- a/Archer/readme.md +++ b/Archer/readme.md @@ -1,5 +1,5 @@ -# Archer贡献内容 +##1203-1205打卡 +**双数之和的一个查找,只实现了最简单的方式,但是,哈希表的解决方案还未完善,没有解决哈希冲突。** - - -双数之和的一个查找,只实现了最简单的方式,但是,哈希表的解决方案还未完善,没有解决哈希冲突。 \ No newline at end of file +##1206-1208 打卡 +**给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。** \ No newline at end of file diff --git a/Archer/twoSum/twoSum.py b/Archer/twoSum/twoSum.py index 986fa9c..f7c49cf 100644 --- a/Archer/twoSum/twoSum.py +++ b/Archer/twoSum/twoSum.py @@ -27,9 +27,7 @@ def twoSum(nums, target): if temp == nums[j]: return [i, j] ''' - # 解法3,用哈希表,空间换时间,第一次循环将数组的值放入哈希表中,第二次循环从哈希表中取出值(待完善) - map_a = dict() k = len(nums) @@ -41,18 +39,24 @@ def twoSum(nums, target): for i in range(0, k): temp = target - nums[i] if temp in map_a and map_a[temp][0]!=i: - return [map_a[temp][0], i] + return [i, map_a[temp][0]] print "No two sum solution" - # 解法4,用哈希表,一边把数组元素放到哈希表中,一边判断哈希表中是否有满足和的两个整数(待完善) + ''' + # 解法4,用哈希表,一边把数组元素放到哈希表中,一边判断哈希表中是否有满足和的两个整数(待完善) map_a = dict() k = len(nums) - for i in range(0, k): - map_a[nums[i]] = (i, nums[i]) - print map_a.items() temp = target - nums[i] - if temp in map_a and map_a[temp][0]!=i: - return [map_a[temp][0], i] + if temp in map_a : + print map_a.items() + return [map_a[temp], i] + map_a[nums[i]] = i ''' + +a = [3, 3, 4, 5] + +b = twoSum(a,8) + +print b \ No newline at end of file diff --git "a/Archer/twoSum/twoSum\350\257\264\346\230\216\345\217\212\345\244\215\347\233\230.md" "b/Archer/twoSum/twoSum\350\257\264\346\230\216\345\217\212\345\244\215\347\233\230.md" new file mode 100644 index 0000000..6a7c6b1 --- /dev/null +++ "b/Archer/twoSum/twoSum\350\257\264\346\230\216\345\217\212\345\244\215\347\233\230.md" @@ -0,0 +1,16 @@ +# 算法实现:(详细见代码文档) # + +# 双数之和的一个查找,只实现了最简单的方式,但是,哈希表的解决方案还未完善,没有解决哈希冲突。 # + +# 复盘 # + +1. 如果两个循环,先循环保存到字典,再循环查找字典里面的键-值 + 困局:哈希冲突,不能把相同的值保存为两个不同的键 + +2. 一个循环 + - 把列表的元素按(元素:索引)存储到字典里时,用目标值target去减下一个要存储的列表元素得到寻找值temp,再找字典里有没有与temp值相同的键,有的话,输出这个键对应的值和下一个要存储的列表的索引。 + (用下一个列表元素产生的差值找字典中存储的列表) + - 把target与列表元素的差值按(差值:该元素索引)存储到字典里,再用下一个要存储的列表元素查找字典,如果有,说明存在另一个列表元素和这个要存储的列表元素相加得到目标值,输出查找到的字典差值中的索引和下一个要存储的列表元素的索引 + (用下一个列表元素找字典中存储的列表元素产生的差值) + +以上两种方法的重点在于,先判断后存储,避免了字典中同时存在要拿来比较的元素,自己比较自己的情况,也避免了哈希冲突,因为即便是由列表中两个相同元素相加得到目标值,也在将列表存储到字典之前,也即产生哈希冲突之前已经判断完成输出了。 From 80038556b2e2dbfd43461bd645e0c092574b6003 Mon Sep 17 00:00:00 2001 From: wycgi520 <437891878@qq.com> Date: Fri, 7 Dec 2018 17:06:34 +0800 Subject: [PATCH 4/5] modify --- Archer/readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Archer/readme.md b/Archer/readme.md index dcb3732..75494ce 100644 --- a/Archer/readme.md +++ b/Archer/readme.md @@ -1,5 +1,5 @@ -##1203-1205打卡 +##1203-1205打卡 ## **双数之和的一个查找,只实现了最简单的方式,但是,哈希表的解决方案还未完善,没有解决哈希冲突。** -##1206-1208 打卡 +##1206-1208 打卡## **给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。** \ No newline at end of file From d19a7ebdb408268f8f537d925b6f8f262917b9e7 Mon Sep 17 00:00:00 2001 From: Liling <841935390@qq.com> Date: Fri, 7 Dec 2018 17:15:40 +0800 Subject: [PATCH 5/5] 20181207 --- ...44\346\225\260\344\271\213\345\222\214.py" | 41 +++++++ codingling/LeetCode-01-twosum/readme.md | 54 +++++++++ ...\345\212\240(\351\223\276\350\241\250).py" | 0 .../LeetCode-02-addtwonumbers/README.md | 112 ++++++++++++++++++ codingling/addtwonumbers/README.md | 15 --- codingling/readme.md | 4 +- 6 files changed, 210 insertions(+), 16 deletions(-) create mode 100644 "codingling/LeetCode-01-twosum/01.TwoSum\344\270\244\346\225\260\344\271\213\345\222\214.py" create mode 100644 codingling/LeetCode-01-twosum/readme.md rename "codingling/addtwonumbers/2.AddTwoNumbers\344\270\244\346\225\260\347\233\270\345\212\240(\351\223\276\350\241\250).py" => "codingling/LeetCode-02-addtwonumbers/02.AddTwoNumbers\344\270\244\346\225\260\347\233\270\345\212\240(\351\223\276\350\241\250).py" (100%) create mode 100644 codingling/LeetCode-02-addtwonumbers/README.md delete mode 100644 codingling/addtwonumbers/README.md diff --git "a/codingling/LeetCode-01-twosum/01.TwoSum\344\270\244\346\225\260\344\271\213\345\222\214.py" "b/codingling/LeetCode-01-twosum/01.TwoSum\344\270\244\346\225\260\344\271\213\345\222\214.py" new file mode 100644 index 0000000..65f7e1a --- /dev/null +++ "b/codingling/LeetCode-01-twosum/01.TwoSum\344\270\244\346\225\260\344\271\213\345\222\214.py" @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# @Author: LiLing +# @Date: 2018-10-02 19:07:51 +# @Last Modified by: Liling +# @Last Modified time: 2018-10-02 19:16:24 +""" +给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。 + +你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。 + +示例: + +给定 nums = [2, 7, 11, 15], target = 9 + +因为 nums[0] + nums[1] = 2 + 7 = 9 +所以返回 [0, 1] +""" +class Solution: + def twoSum(self, nums, target): + """ + :type nums: List[int] + :type target: int + :rtype: List[int] + """ + for i in range(len(nums)): + res = nums[i+1:] + resnum = target-nums[i] + if resnum in res: + j = res.index(resnum) + return [i,i+j+1] + +class Solution(): + def twoSum(self, nums, target): + hashdict = {} + for i, item in enumerate(nums): + if (target - item) in hashdict: + return (hashdict[target - item], i) + hashdict[item] = i + return (-1, -1) +s = Solution() +print(s.twoSum([2, 7, 11, 15], 9)) \ No newline at end of file diff --git a/codingling/LeetCode-01-twosum/readme.md b/codingling/LeetCode-01-twosum/readme.md new file mode 100644 index 0000000..c4c5321 --- /dev/null +++ b/codingling/LeetCode-01-twosum/readme.md @@ -0,0 +1,54 @@ +## 01.TwoSum两数之和 + +### 题目描述 + +给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。 + +你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。 + +示例: + +给定 nums = [2, 7, 11, 15], target = 9 + +因为 nums[0] + nums[1] = 2 + 7 = 9 +所以返回 [0, 1] + +### 思路 + +第一种思路是比较直观也是复杂度比较高的解法,遍历列表中的每个元素,在剩下的元素中找有没有使得两个数之和为目标值的数。 + +```python +class Solution: + def twoSum(self, nums, target): + """ + :type nums: List[int] + :type target: int + :rtype: List[int] + """ + for i in range(len(nums)): + res = nums[i+1:] + resnum = target-nums[i] + if resnum in res: + j = res.index(resnum) + return [i,i+j+1] +``` + +这种解法的时间复杂度是$O(n^2)$,因为需要遍历,遍历的同时还要在剩下的元素中查找。空间复杂度是O(1)。 + + + +第二种思路是用哈希,也是要遍历列表,但是遍历的同时将当前值及其index存入哈希字典,并且在哈希字典中查找有没有想要的值。 + +```python +class Solution(): + def twoSum(self, nums, target): + hashdict = {} + for i, item in enumerate(nums): + if (target - item) in hashdict: + return (hashdict[target - item], i) + hashdict[item] = i + return (-1, -1) +``` + +这种解法的时间复杂度是O(n),空间复杂度是O(n)。 + diff --git "a/codingling/addtwonumbers/2.AddTwoNumbers\344\270\244\346\225\260\347\233\270\345\212\240(\351\223\276\350\241\250).py" "b/codingling/LeetCode-02-addtwonumbers/02.AddTwoNumbers\344\270\244\346\225\260\347\233\270\345\212\240(\351\223\276\350\241\250).py" similarity index 100% rename from "codingling/addtwonumbers/2.AddTwoNumbers\344\270\244\346\225\260\347\233\270\345\212\240(\351\223\276\350\241\250).py" rename to "codingling/LeetCode-02-addtwonumbers/02.AddTwoNumbers\344\270\244\346\225\260\347\233\270\345\212\240(\351\223\276\350\241\250).py" diff --git a/codingling/LeetCode-02-addtwonumbers/README.md b/codingling/LeetCode-02-addtwonumbers/README.md new file mode 100644 index 0000000..693a6b9 --- /dev/null +++ b/codingling/LeetCode-02-addtwonumbers/README.md @@ -0,0 +1,112 @@ +## 2.AddTwoNumbers两数相加(链表) + +### 题目描述 + +给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。 + +你可以假设除了数字 0 之外,这两个数字都不会以零开头。 + +示例: + +输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) +输出:7 -> 0 -> 8 +原因:342 + 465 = 807 + + + +单链表的定义是这样的: + +```python +class ListNode: + def __init__(self, x): + self.val = x + self.next = None +``` + +###思路 + +这里给出了三种解法 + +解法一:只需要按逆序的顺序将各位数加起来即可,有进位的地方标志一下。 + +```python +class Solution(object): + def addTwoNumbers(self, l1, l2): + pNode = ListNode(0) + pHead = pNode + val = 0 + while l1 or l2 or val: + if l1: + val += l1.val + l1 = l1.next + if l2: + val += l2.val + l2 = l2.next + pNode.next = ListNode(val % 10) + val /= 10 + pNode = pNode.next + return pHead.next +``` + +思路一样,但换了种写法: + +```python +class Solution: + def addTwoNumbers(self, l1, l2): + """ + :type l1: ListNode + :type l2: ListNode + :rtype: ListNode + """ + node1 = l1 + node2 = l2 + dummyRoot = ListNode(0) + ptr = dummyRoot + carry = 0 + while node1 or node2: + ptr.next = ListNode((node1.val if node1 else 0) + (node2.val if node2 else 0) + carry) + ptr = ptr.next + carry = ptr.val //10 + ptr.val %= 10 + node1 = node1.next if node1 else None + node2 = node2.next if node2 else None + if carry: + ptr.next = ListNode(carry) + return dummyRoot.next +``` + +解法二:先把两个数字用int型表示出来,相加之和再存成链表形式: + +```python +class Solution: + def addTwoNumbers(self, l1, l2): + """ + :type l1: ListNode + :type l2: ListNode + :rtype: ListNode + """ + + sl1 = '' + sl2 = '' + + while l1: + sl1 += str(l1.val) + l1 = l1.next + + while l2: + sl2 += str(l2.val) + l2 = l2.next + + sum = str(int(sl1[::-1]) + int(sl2[::-1])) + + head = tail = ListNode(0) + + for cha in sum[::-1]: + cur = ListNode(cha) + tail.next = cur + tail = cur + + return head.next +``` + +上述解法的时间复杂度都是O(max(m,n)),空间复杂度也是O(max(m,n)),其中m和n分别代表两个链表的长度。 \ No newline at end of file diff --git a/codingling/addtwonumbers/README.md b/codingling/addtwonumbers/README.md deleted file mode 100644 index ab6a3ca..0000000 --- a/codingling/addtwonumbers/README.md +++ /dev/null @@ -1,15 +0,0 @@ -## 2.AddTwoNumbers两数相加(链表) - -### 题目描述 - -给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。 - -你可以假设除了数字 0 之外,这两个数字都不会以零开头。 - -示例: - -输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) -输出:7 -> 0 -> 8 -原因:342 + 465 = 807 - -这里给出了三种解法 \ No newline at end of file diff --git a/codingling/readme.md b/codingling/readme.md index cac534e..a76c870 100644 --- a/codingling/readme.md +++ b/codingling/readme.md @@ -1,3 +1,5 @@ # codingling贡献内容 -1.AddTwoNumbers两数相加(链表) \ No newline at end of file +- AddTwoNumbers两数相加(链表),2018/12/04 + +- TwoSum两数之和,2018/12/07 \ No newline at end of file