先排序,用三个指针k, i, j。k遍历序列,控制外层循环,i, j为每个k寻找和为-nums[k]的组合,为双指针从两头逼近中间,控制内层循环。
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
def qsort(nums,le,ri):
if le<ri:
l,r = le,ri
n = random.randint(le,ri)
nums[n],nums[le]=nums[le],nums[n]
cur = nums[le]
while le<ri:
while le<ri and nums[ri]>=cur:ri-=1
nums[le]=nums[ri]
while le<ri and nums[le]<=cur:le+=1
nums[ri]=nums[le]
nums[le]=cur
qsort(nums,l,le-1)
qsort(nums,le+1,r)
qsort(nums,0,len(nums)-1)
k = 0
i,j = k+1,len(nums)-1
res = []
while k<len(nums)-2 and nums[k]<=0:
i,j = k+1,len(nums)-1
while i<j:
tempsum = nums[i]+nums[j]+nums[k]
if tempsum==0:
if [nums[k],nums[i],nums[j]] not in res:
res.append([nums[k],nums[i],nums[j]])
i+=1
elif tempsum<0:i+=1
else:j-=1
k+=1
while k<len(nums)-2 and nums[k]==nums[k-1]:k+=1
return res
到10进位,最高位没节点就新建一个
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
cur = l1
len1, len2 = 0, 0
while cur:
len1+=1
cur = cur.next
cur = l2
while cur:
len2+=1
cur = cur.next
if len2>len1:
l1,l2=l2,l1
len1,len2=len2,len1
head = l1
for i in range(len1):
if l2 and l1:
l1.val = l1.val + l2.val
if l1.val>=10:
l1.val-=10
if l1.next:l1.next.val+=1
else:l1.next=ListNode(1)
l1 = l1.next
l2 = l2.next
else:
if l1.val>=10:
l1.val-=10
if l1.next:l1.next.val+=1
else:l1.next=ListNode(1)
l1 = l1.next
return head