5.13leetcode15. 三数之和面试题 02.05. 链表求和

15. 三数之和

先排序,用三个指针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

面试题 02.05. 链表求和 

 到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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值