zoukankan      html  css  js  c++  java
  • 面试题 02.05. 链表求和

    题意

    给定两个用链表表示的整数,每个节点包含一个数位。

    这些数位是反向存放的,也就是个位排在链表首部。

    编写函数对这两个整数求和,并用链表形式返回结果。

    思路

    • 因为链表也不知道多长,如果选择各自遍历得到值再相加,然后再生成新的链表的话,可能会超出数值类型的精度范围(Python 不会,所以有提供者 python 的对应代码)
    • 所以更为通用的解法应该是
      • 同时遍历 l1l2
      • 模拟进行加法,注意要带上低位来的进位
    • ⚠️细节
      • 最高位仍有可能进位,这个要额外处理

    Java 代码

    // 边扫描边做
    class Solution {
        public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
            ListNode dummy = new ListNode(0);
            dummy.next = null;
            ListNode pos = dummy;
            int remainder = 0;
            while(l1 != null || l2 != null) {
                int x = 0, y = 0;
                if(l1 != null) {
                    x = l1.val;
                    l1 = l1.next;
                }
                if(l2 != null) {
                    y = l2.val;
                    l2 = l2.next;
                } 
                int sum = x + y + remainder;
                ListNode newNode = new ListNode(sum % 10);
                pos.next = newNode;
                pos = pos.next;
                remainder = sum / 10;
            }
            if(remainder > 0) {
                ListNode newNode = new ListNode(remainder);
                pos.next = newNode;
                pos = pos.next;
                pos.next = null;
            } else {
              	pos.next = null;
            }
            return dummy.next;
        }
    }
    

    python 代码

    # 边扫描边计算
    class Solution:
        def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
            dummy = ListNode(0)
            pos = dummy;
            remainder = 0
            while l1 or l2:
                x = l1.val if l1 else 0
                y = l2.val if l2 else 0
                if l1: l1 = l1.next
                if l2: l2 = l2.next
                sum = x + y + remainder
                new_node = ListNode(sum % 10)
                remainder = sum // 10
                pos.next = new_node
                pos = pos.next
            if remainder > 0:
                new_node = ListNode(remainder)
                pos.next = new_node
                pos = pos.next
                pos.next = None
            else:
                pos.next = None
            return dummy.next
            
    
    # 各自得到结果再相加
    class Solution:
        def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
            def get_value(cur):
                value_list, value = [], 0
                while cur:
                    value_list.append(cur.val)
                    cur = cur.next
                for num in value_list[::-1]:
                    value *= 10
                    value += num
                return value
            add_value = get_value(l1) + get_value(l2)
            if add_value == 0: return ListNode(0)
            dummy = ListNode(0)
            pos = dummy
            while add_value:
                val = add_value % 10
                add_value = add_value // 10
                new_node = ListNode(val)
    
                pos.next = new_node
                pos = pos.next
            return dummy.next
    
    如有转载,请注明出处QAQ
  • 相关阅读:
    attachEvent 中this指向
    JS window.name跨域封装
    【javascript基础】8、闭包
    【javascript基础】7、继承
    【javascript基础】6、new与构造函数
    【javascript基础】5、创建对象
    【javascript基础】4、原型与原型链
    【javascript基础】3、变量和作用域
    【javascript基础】2、函数
    【javascript基础】1、基本概念
  • 原文地址:https://www.cnblogs.com/MartinLwx/p/15469090.html
Copyright © 2011-2022 走看看