package LeetCode_445 import LeetCode_2.ListNode /** * 445. Add Two Numbers II * https://leetcode.com/problems/add-two-numbers-ii/description/ * * You are given two non-empty linked lists representing two non-negative integers. * The most significant digit comes first and each of their nodes contain a single digit. * Add the two numbers and return it as a linked list. You may assume the two numbers do not contain any leading zero, except the number 0 itself. Follow up: What if you cannot modify the input lists? In other words, reversing the lists is not allowed. Example: Input: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4) Output: 7 -> 8 -> 0 -> 7 * */ class Solution { /* * Time complexity:O(max(m,n)), Space complexity:O(max(m,n)) * */ fun addTwoNumbers(l1: ListNode?, l2: ListNode?): ListNode? { val str1 = ListNodeToString(l1) val str2 = ListNodeToString(l2) val array1 = str1.toCharArray() val array2 = str2.toCharArray() var i = array1.size - 1 var j = array2.size - 1 var carry = 0 val sb = StringBuilder() while (i >= 0 || j >= 0) { val value1 = if (i >= 0) array1[i--] - '0' else 0 val value2 = if (j >= 0) array2[j--] - '0' else 0 var temp = value1 + value2 + carry if (temp >= 10) { carry = temp / 10 temp %= 10 } else { carry = 0 } sb.insert(0, temp) } if (carry != 0) { sb.insert(0, 1) } val dummy = ListNode(0) var tail = dummy for (item in sb) { tail.next = ListNode(item - '0') tail = tail.next!! } return dummy.next } private fun ListNodeToString(l1_: ListNode?): String { var l1 = l1_ val sb = StringBuilder() while (l1 != null) { sb.append(l1.`val`) l1 = l1.next } return sb.toString() } }