给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
日常水题
难点是单向链表子节点加完要找父节点,所以整一个能找到父节点的数据结构就好了。
简单的其实就是反转链表就好,两链表翻转然后从头开始加,加完返回就行。
另一种做法是栈,两个链表压栈,再从栈里取出来相加。
我的处理方式是把子节点与父节点的关系存到map里,遍历到最右的子节点。
两个子节点相加,之后从map里找到父节点,,然后重复上述操作。
以下是代码
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
if (l1.val == 0) {
return l2;
}
HashMap<ListNode, ListNode> m1 = new HashMap<>();
HashMap<ListNode, ListNode> m2 = new HashMap<>();
ListNode temp1 = getListNode(l1, m1);
ListNode temp2 = getListNode(l2, m2);
int temp = 0;
while (true) {
if (temp2 != null) {
temp1.val = temp1.val + temp2.val + temp;
} else {
temp1.val = temp1.val + temp;
}
temp = temp1.val / 10;
temp1.val = temp1.val % 10;
temp1 = m1.getOrDefault(temp1, new ListNode(0, temp1));
temp2 = m2.get(temp2);
if (temp2 == null && temp == 0) {
if (m1.get(temp1) == null)
break;
}
}
if (temp1.val == 0) {
return temp1.next;
}
return temp1;
}
private ListNode getListNode(ListNode listNode, HashMap<ListNode, ListNode> map) {
if (listNode.next == null) {
return listNode;
}
do {
map.put(listNode.next, listNode);
listNode = listNode.next;
} while (listNode != null && listNode.next != null);
return listNode;
}
水完收工