leetcode_2_Add_Two_Numbers
来源:互联网 发布:数控车铣一体机编程 编辑:程序博客网 时间:2024/04/28 20:25
第二题,没什么复杂的直接上代码好了,简单说就是首先两个链表相加,然后反向存储,最后转化成list输出
#!/usr/bin/env python# -*- coding:utf-8 -*-"""Copyright (c) 2017 Xu Zhihao (Howe). All rights reserved.This program is free software; you can redistribute it and/or modify"""carray = False# Definition for singly-linked list.class ListNode(object): def __init__(self): self.val = None self.next = Noneclass ListNode_handle: def __init__(self): self.cur_node = None def add(self, data): #add a new node pointed to previous node node = ListNode() node.val = data node.next = self.cur_node self.cur_node = node return node def print_ListNode(self, node): while node: print '\nnode: ', node, ' value: ', node.val, ' next: ', node.next node = node.next def _reverse(self, nodelist): list = [] while nodelist: list.append(nodelist.val) nodelist = nodelist.next result = ListNode() result_handle = ListNode_handle() for i in list: result = result_handle.add(i) return result def get_list(self, nodelist): list = [] while nodelist: list.append(nodelist.val) nodelist = nodelist.next return listclass Solution(object): def addTwoNumbers(self, l1, l2): """ :type l1: ListNode :type l2: ListNode :rtype: ListNode """ global carry carry = False result_handle = ListNode_handle() result = ListNode() while l1 != None or l2 != None: if not carry: if l1 != None and l2 != None: l3_val = l1.val + l2.val elif l1 == None and l2 != None: l3_val = l2.val elif l1 != None and l2 == None: l3_val = l1.val else: pass else: if l1 != None and l2 != None: l3_val = l1.val + l2.val + 1 elif l1 == None and l2 != None: l3_val = l2.val + 1 elif l1 != None and l2 == None: l3_val = l1.val + 1 else : pass carry = False if l3_val < 10: result = result_handle.add(l3_val) else: result = result_handle.add(l3_val%10) carry = True try: l1 = l1.next except: pass try: l2 = l2.next except: pass result = result_handle._reverse(result) result_list = [] result_list = result_handle.get_list(result) if carry: result_list.append(1) result = result_handle.add(1) result = result_handle._reverse(result) result_handle.print_ListNode(result) return result_listif __name__ == "__main__": # creat 2 linked lists ListNode_1 = ListNode_handle() l1 = ListNode() l1_list = [1,8] for i in l1_list: l1 = ListNode_1.add(i) ListNode_2 = ListNode_handle() l2 = ListNode() l2_list = [9] for i in l2_list: l2 = ListNode_2.add(i) #reverse 2 linked lists l1 = ListNode_1._reverse(l1) l2 = ListNode_2._reverse(l2) #get result result = Solution().addTwoNumbers(l1, l2) print result
首先设置进位:
carray = False
然后设置链表格式:
# Definition for singly-linked list.class ListNode(object): def __init__(self): self.val = None self.next = None
然后再设置添加链表功能:
def add(self, data): #add a new node pointed to previous node node = ListNode() node.val = data node.next = self.cur_node self.cur_node = node return node
设置反向:
def _reverse(self, nodelist): list = [] while nodelist: list.append(nodelist.val) nodelist = nodelist.next result = ListNode() result_handle = ListNode_handle() for i in list: result = result_handle.add(i) return result
输出list
def get_list(self, nodelist): list = [] while nodelist: list.append(nodelist.val) nodelist = nodelist.next return list
两个链表相加的结果函数:
def addTwoNumbers(self, l1, l2): """ :type l1: ListNode :type l2: ListNode :rtype: ListNode """ global carry carry = False result_handle = ListNode_handle() result = ListNode() while l1 != None or l2 != None: if not carry: if l1 != None and l2 != None: l3_val = l1.val + l2.val elif l1 == None and l2 != None: l3_val = l2.val elif l1 != None and l2 == None: l3_val = l1.val else: pass else: if l1 != None and l2 != None: l3_val = l1.val + l2.val + 1 elif l1 == None and l2 != None: l3_val = l2.val + 1 elif l1 != None and l2 == None: l3_val = l1.val + 1 else : pass carry = False if l3_val < 10: result = result_handle.add(l3_val) else: result = result_handle.add(l3_val%10) carry = True try: l1 = l1.next except: pass try: l2 = l2.next except: pass result = result_handle._reverse(result) result_list = [] result_list = result_handle.get_list(result) if carry: result_list.append(1) result = result_handle.add(1) result = result_handle._reverse(result) result_handle.print_ListNode(result) return result_list
官网上的解:
class Solution(object): def addTwoNumbers(self, l1, l2): carry = 0 root = n = ListNode(0) while l1 or l2 or carry: v1 = v2 = 0 if l1: v1 = l1.val l1 = l1.next if l2: v2 = l2.val l2 = l2.next carry, val = divmod(v1+v2+carry, 10) n.next = ListNode(val) n = n.next return root.next
分析:
这里他默认了l1,l2是链表了,所以我之前建立链表的操作比较多余。
然后算法上,他用了
divmod这个函数的功能是整除,返回值为(进位,余数),这也比我单独设置carry好
整体思路是:
先定义了root 和 n同时候一个指向None的值为0的ListNode,root不变
然后遍历l1,l2,
如过l1有值则取出l1中的值v1,然后将l1指向下一个
如过l2有值则取出l2中的值v2,然后将l2指向下一个
接着计算(值v1+值v2+进位)的求和之后对10求余数,得到新的进位和余数
再接着,将n指向新的余数,root保持不变
依次循环
返回root的所指向的下一位
eg:(2 -> 4 -> 3) + (5 -> 6 -> 4)
他的结果是:7 -> 0 -> 8
但是root的值为0 -> 7 -> 0 -> 8
GitHub: https://github.com/DinnerHowe/LeetCode.git
0 0
- leetcode_2_Add_Two_Numbers
- 关于NIO笔记(四):管道Pipe
- Paxos算法与Zookeeper分析
- Java 读书笔记9 接口
- A股-入门-新手该如何成功选股
- 总结ASP.NET MVC Web Application中将数据显示到View中的几种方式
- leetcode_2_Add_Two_Numbers
- spring4+hibernate4+maven 项目整合
- Ubuntu-Could not get lock /var/lib/dpkg/lock
- 任务控制块
- Twitter的分布式自增ID算法snowflake
- NTA算法讲解
- ceph repo配置文件
- 数组与方法
- 开发android中,解决View.getLocationOnScreen为0