package suanfa.lintcode;
import java.util.Stack;
//链表
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
next = null;
}
}
public class SumListNode {
/**
* 链表求和1:你有两个用链表代表的整数,其中每个节点包含一个数字。数字存储按照在原来整数中相反的顺序,
* 使得第一个数字位于链表的开头。写出一个函数将两个整数相加,用链表形式返回和。
*
* @param l1
* example:3->1->5->null
* @param l2
* example:5->9->2->null
* @return
* example:8->0->8->null
*/
public ListNode addListNode1(ListNode l1, ListNode l2) {
ListNode result = new ListNode(0);
ListNode node = result;
// 进位标志
int flag = 0;
while (l1 != null && l2 != null) {
int value = l1.val + l2.val + flag;
flag = value / 10;
value = value % 10;
node.next = new ListNode(value);
node = node.next;
l1 = l1.next;
l2 = l2.next;
}
while (l1 != null) {
int value = l1.val + flag;
flag = value / 10;
value = value % 10;
node.next = new ListNode(value);
node = node.next;
l1 = l1.next;
}
while (l2 != null) {
int value = l2.val + flag;
flag = value / 10;
value = value % 10;
node.next = new ListNode(value);
node = node.next;
l2 = l2.next;
}
if (flag == 1) {
node.next = new ListNode(1);
node = node.next;
}
return result.next;
}
/**
* 链表求和2: 假定用一个链表表示两个数,其中每个节点仅包含一个数字。
* 假设这两个数的数字顺序排列,请设计一种方法将两个数相加,并将其结果表现为链表的形式
*
* @param l1
* example:6->1->7
* @param l2
* example:2->9->5
* @return
* example:9->1->2
*/
public ListNode addListNode2(ListNode l1, ListNode l2) {
Stack<Integer> stack1 = getListNodeStack(l1);
Stack<Integer> stack2 = getListNodeStack(l2);
ListNode result = new ListNode(0);
int flag = 0; // 进位标志
// 对于两个链表,长度相等时计算
while (!stack1.isEmpty() && !stack2.isEmpty()) {
int value = stack1.pop() + stack2.pop() + flag;
flag = value / 10;
value = value % 10;
// 创建一个新的节点
ListNode curr = new ListNode(value);
// 当前节点的next 指向之前的一个节点
curr.next = result.next;
// 将当前节点存储起来
result.next = curr;
}
// 当第一个链表长度大于第二个链表长度时
while (!stack1.isEmpty()) {
int value = stack1.pop() + flag;
flag = value / 10;
value = value % 10;
// 创建一个新的节点
ListNode curr = new ListNode(value);
// 当前节点的next 指向之前的一个节点
curr.next = result.next;
// 将当前节点存储起来
result.next = curr;
}
// 当第二个链表长度大于第一个链表长度时
while (!stack2.isEmpty()) {
int value = stack2.pop() + flag;
flag = value / 10;
value = value % 10;
// 创建一个新的节点
ListNode curr = new ListNode(value);
// 当前节点的next 指向之前的一个节点
curr.next = result.next;
// 将当前节点存储起来
result.next = curr;
}
// 如果flag等于1,则需要创建一个新的节点
if (flag == 1) {
ListNode curr = new ListNode(1);
curr.next = result.next;
result.next = curr;
}
return result.next;
}
/**
* 将链表存储到栈里面
*
* @param node
* @return Stack
*/
public Stack<Integer> getListNodeStack(ListNode node) {
Stack<Integer> stack = new Stack<>();
while (node != null) {
stack.push(node.val);
node = node.next;
}
return stack;
}
}
网友评论