• LeetCode #2.两数相加


    力扣 | 2.两数相加

    题目截图

     官方方法

    总共有三个链表,l1,l2和最后的结果链表。l1和l2各自滑动对应链表各个位数支出相应的值,最后相加,将结果添加到新链表上。

    唯一需要考虑的是数值相加后的进位。

    先设置进位carry为0

    结果相加的时候利用取模和取整来进位。

    比如,8+7=15,各位留5,进位为1。

    创建一个头结点head和一个移动结点p

    当l1或l2存在时,新建一个结点new_point并赋值为0。然后进入判断:

    若l1不存在,则只用将l2的值付给新链表。反之,亦然。若两个都存在,则当前位的值为(l1的值+l2的值)取模,进位为两者之和除10取整。,然后指针往后滑动,知道l1和l2都遍历完成

    还需要注意全部遍历完成后可能还有进位,再添加一个结点,并赋值为1。

    最后返回头结点。

    代码如下

    1. def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
    2. head = point = ListNode(0)
    3. carry = 0
    4. while l1 or l2:
    5. new_point = ListNode(0)
    6. if not l1:
    7. sum_=l2.val+carry
    8. new_point.val = sum_ % 10
    9. carry = sum_ // 10
    10. l2 = l2.next
    11. elif not l2:
    12. sum_ = l1.val +carry
    13. new_point.val = sum_ % 10
    14. carry = sum_ // 10
    15. l1 = l1.next
    16. else:
    17. sum_ = l1.val + l2.val + carry
    18. new_point.val = sum_ % 10
    19. carry = sum_ // 10
    20. l1 = l1.next
    21. l2 = l2.next
    22. point.next = new_point
    23. point = point.next
    24. if carry:
    25. new_point = ListNode(1)
    26. point.next = new_point
    27. return head.next

    完整测试代码

    1. # Definition for singly-linked list.
    2. from typing import Optional
    3. class ListNode:
    4. def __init__(self, val=0, next=None):
    5. self.val = val
    6. self.next = next
    7. class Solution:
    8. def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
    9. head = point = ListNode(0)
    10. carry = 0
    11. while l1 or l2:
    12. new_point = ListNode(0)
    13. if not l1:
    14. sum_=l2.val+carry
    15. new_point.val = sum_ % 10
    16. carry = sum_ // 10
    17. l2 = l2.next
    18. elif not l2:
    19. sum_ = l1.val +carry
    20. new_point.val = sum_ % 10
    21. carry = sum_ // 10
    22. l1 = l1.next
    23. else:
    24. sum_ = l1.val + l2.val + carry
    25. new_point.val = sum_ % 10
    26. carry = sum_ // 10
    27. l1 = l1.next
    28. l2 = l2.next
    29. point.next = new_point
    30. point = point.next
    31. if carry:
    32. new_point = ListNode(1)
    33. point.next = new_point
    34. return head.next
    35. class Linked_List:
    36. def create_linked_list(self, nums):
    37. if len(nums) == 0:
    38. return None
    39. head = ListNode(nums[0])
    40. cur = head
    41. for i in range(1, len(nums)):
    42. cur.next = ListNode(nums[i])
    43. cur = cur.next
    44. return head
    45. def print_linked_list(list_node):
    46. if list_node is None:
    47. return
    48. cur = list_node
    49. while cur:
    50. print(cur.val, '->', end=' ')
    51. cur = cur.next
    52. print('null')
    53. class main:
    54. list_1 = [2,4,3]
    55. list_2 = [5,6,4]
    56. solution = Solution()
    57. link_list = Linked_List()
    58. head_1 = link_list.create_linked_list(list_1)
    59. head_2 = link_list.create_linked_list(list_2)
    60. answer = solution.addTwoNumbers(head_1, head_2)
    61. print_linked_list(answer)
    62. if __name__ == '__main__':
    63. main()

    pycharm上测试结果

     

    简化代码版

    简化代码版的思路和官方方法相差不大。

    但是直接将l1和l2以及进位的问题合并考虑,并运用三元表达式简化代码量。

    代码如下

    1. class Solution:
    2. def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
    3. head = p = ListNode(None)
    4. carry = 0
    5. while l1 or l2 or carry:
    6. carry += (l1.val if l1 else 0) + (l2.val if l2 else 0)
    7. p.next = ListNode(carry % 10)
    8. p = p.next
    9. carry = carry // 10
    10. l1 = l1.next if l1 else None
    11. l2 = l2.next if l2 else None
    12. return head.next

  • 相关阅读:
    通讯网关软件005——利用CommGate X2OPC实现OPC客户端访问MS SQL服务器
    Spring Boot 3 整合 xxl-job 实现分布式定时任务调度,结合 Docker 容器化部署(图文指南)
    Redis(事务和持久化)(很重要!)
    Shell编程自动化之特殊变量、特殊状态变量和Shell子串
    持续进化,快速转录,Faster-Whisper对视频进行双语字幕转录实践(Python3.10)
    kubernetes helm
    Spark 优化 (二) --------- Spark 数据倾斜
    数据库索引:综合详细指南
    android 车载widget小部件部分详细源码实战开发-千里马车载车机framework开发实战课程
    SpringBoot JavaBean对象拷贝 orika
  • 原文地址:https://blog.csdn.net/weixin_42112343/article/details/128213579