Add 2 linkedlists without reverse in O(n) and constant space.
eg: 1->2->3 + 1->7 = 1->4->0
Solution: recursion
1. 在短的list前面补0使得两个list一样长
2. recursively add two lists
3. 处理第一位,如果第一位是0,说明第一位原本>=10, 在前面加1
相似的leetcode问题:Add Two Numbers
1. 在短的list前面补0使得两个list一样长
2. recursively add two lists
3. 处理第一位,如果第一位是0,说明第一位原本>=10, 在前面加1
相似的leetcode问题:Add Two Numbers
public class LinkedListAddition {
// carry must defined as global variable
public static int carry = 0;
public class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
// create new node
ListNode newNode(int x) {
ListNode node = new ListNode(x);
node.val = x;
node.next = null;
return node;
}
public static void main(String[] args) {
LinkedListAddition list = new LinkedListAddition();
// create 1->2->3
ListNode l1 = list.newNode(1);
l1.next = list.newNode(2);
l1.next.next = list.newNode(3);
// create 1->7
ListNode l2 = list.newNode(1);
l2.next = list.newNode(7);
// print linkedlist
System.out.println("Two input LinkedList: ");
printLinkedList(l1);
printLinkedList(l2);
// insert 0 to make shorter list has the same length as the longer list
int len1 = len(l1);
int len2 = len(l2);
int diff = Math.abs(len1 - len2);
ListNode newL2;
ListNode newL1;
if (len1 > len2) {
ListNode node = list.newNode(0);
newL2 = node;
diff--;
while (diff > 0) {
node.next = list.newNode(0);
node = node.next;
diff--;
}
node.next = l2;
System.out.print("newL2: ");
printLinkedList(newL2);
// recursively add two lists
addList(l1, newL2);
} else if (len1 < len2) {
ListNode node = list.newNode(0);
newL1 = node;
diff--;
while (diff > 0) {
node.next = list.newNode(0);
newL1 = node.next;
diff--;
}
node.next = l1;
System.out.print("newL1: ");
printLinkedList(newL1);
// recursively add two lists
addList(newL1, l2);
} else {
// recursively add two lists
addList(l1, l2);
}
System.out.print("After adding, l1 is: ");
printLinkedList(l1);
// if first digit is 0 means it is >= 10, need to deal with this carry
if (l1.val == 0) {
ListNode newHead = list.newNode(1);
newHead.next = l1;
System.out.print("Result: ");
printLinkedList(newHead);
}
}
public static ListNode addList(ListNode l1, ListNode l2) {
if (l1 == null) {
return l1;
}
addList(l1.next, l2.next);
carry = l1.val + l2.val + carry;
if (carry >= 10) {
l1.val = carry - 10;
carry = 1;
} else {
l1.val = carry;
carry = 0;
}
return l1;
}
public static int len(ListNode head) {
int count = 0;
ListNode node = head;
while (node != null) {
node = node.next;
count++;
}
return count;
}
public static void printLinkedList(ListNode head) {
ListNode node = head;
while (node != null) {
if (node.next == null) {
System.out.print(node.val);
} else {
System.out.print(node.val + "->");
}
node = node.next;
}
System.out.println();
}
}
No comments:
Post a Comment