welcome to my blog
程序员代码面试指南第二版 21.两个链表生成相加链表
题目描述
假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。
给定两个这种链表,请生成代表两个整数相加值的结果链表。
例如:链表 1 为 9->3->7,链表 2 为 6->3,最后生成新的结果链表为 1->0->0->0。
输入描述:
第一行两个整数 n 和 m,分别表示两个链表的长度。
第二行 n 个整数 ai 表示第一个链表的节点。
第三行 m 个整数 bi 表示第二个链表的节点。
输出描述:
输出一行整数表示结果链表。
示例1
输入
3 2
9 3 7
6 3
输出
1 0 0 0
第一次做; 跟LeetCode第2题基本一样, 但是比LeetCode第2题难, 因为需要先对链表进行翻转; 需要随时考虑进位; 反转链表的while循环内部有4行代码; 技巧:创建临时节点
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
int n = Integer.parseInt(str.split(" ")[0]);
int m = Integer.parseInt(str.split(" ")[1]);
//input check
if(n<0 || m<0)
return;
String[] linkedList1 = sc.nextLine().split(" ");
String[] linkedList2 = sc.nextLine().split(" ");
//生成链表
ListNode head1 = new ListNode(Integer.parseInt(linkedList1[0]));
ListNode curr = head1;
for(int i=1; i<n; i++){
curr.next = new ListNode(Integer.parseInt(linkedList1[i]));
curr = curr.next;
}
ListNode head2 = new ListNode(Integer.parseInt(linkedList2[0]));
curr = head2;
for(int i=1; i<m; i++){
curr.next = new ListNode(Integer.parseInt(linkedList2[i]));
curr = curr.next;
}
//execute
//反转链表1
ListNode left = null, right;
curr = head1;
while(curr!=null){
//save next
right = curr.next;
//change
curr.next = left;
//update
left = curr;
curr = right;
}
//保存反转后的头结点
head1 = left;
//反转链表2
left = null;
curr = head2;
while(curr!=null){
//save
right = curr.next;
//change
curr.next = left;
//update
left = curr;
curr = right;
}
//保存反转后的头结点
head2 = left;
//开始相加
ListNode p1 = head1, p2 = head2;
//临时头结点
ListNode temp = new ListNode(0);
left = temp;
int carry = 0, sum;
while(p1!=null && p2!=null){
sum = (p1.val + p2.val + carry) % 10;
carry = (p1.val + p2.val + carry) / 10;
left.next = new ListNode(sum);
//update
left = left.next;
p1 = p1.next;
p2 = p2.next;
}
while(p1!=null){
sum = (p1.val + carry) % 10;
carry = (p1.val + carry) / 10;
left.next = new ListNode(sum);
//update
left = left.next;
p1 = p1.next;
}
while(p2!=null){
sum = (p2.val + carry) % 10;
carry = (p2.val + carry) / 10;
left.next = new ListNode(sum);
//update
left = left.next;
p2 = p2.next;
}
if(carry==1){
left.next = new ListNode(1);
}
//反转结果链表
left = null;
curr = temp.next;
while(curr!=null){
//save
right = curr.next;
//change
curr.next = left;
//update
left = curr;
curr = right;
}
//保存结果链表的头
temp = left;
//反转链表1
right = null;
curr = head1;
while(curr!=null){
//save
left = curr.next;
//change
curr.next = right;
//update
right = curr;
curr = left;
}
//保存链表1的头
head1 = right;
//反转链表2
right = null;
curr = head2;
while(curr!=null){
//save
left = curr.next;
//change
curr.next = right;
//update
right = curr;
curr = left;
}
//保存链表2的头
head2 = right;
//打印结果
curr = temp;
while(curr!=null){
System.out.print(curr.val+" ");
curr = curr.next;
}
}
public static class ListNode{
int val;
ListNode next;
ListNode(int val){
this.val = val;
}
}
}