目录
- 题目描述:
- 输入:
- 输出:
- 代码实现:
题目描述:
给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
输入:
l1 = [7,2,4,3], l2 = [5,6,4]
输出:
[7,8,0,7]
代码实现:
新建一个结点类:
public class ListNode {int val;ListNode next;ListNode() {}ListNode(int val) {this.val = val;}ListNode(int val, ListNode next) {this.val = val;this.next = next;}
}
主函数代码:
public class Main{public static void main(String[] args) {//链表1ListNode l1 = new ListNode(7);l1.next = new ListNode(2);l1.next.next = new ListNode(4);l1.next.next.next = new ListNode(3);//链表2ListNode l2 = new ListNode(5);l2.next = new ListNode(6);l2.next.next = new ListNode(4);//先反转//调用函数ListNode head = addTwoNumbers(l1, l2);//打印结果链表ListNode l = head;while (l != null) {System.out.print(l.val + " ");//7 8 0 7l = l.next;}}//反转链表public static ListNode reverseList(ListNode head) {//前驱指针ListNode pre = null;//当前指针ListNode current = head;//后继指针ListNode next;//反转操作while (current != null) {//保存后继结点信息next = current.next;//当前结点指向前驱current.next = pre;//pre指向当前结点pre = current;//当前结点指针指向下一个结点current = next;}//pre为反转之后的头结点return pre;}/*** 依次从头指针的位置开始取两条链表的运算数,做加法运算:得到每一轮的结果之和将余数存入,* 对结果取余,得到进位的值,并在下一轮运算中做加数** @param l1 链表1* @param l2 链表2* @return 结果链表的头指针*/public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {//先反转用于运算l1 = reverseList(l1);l2 = reverseList(l2);//定义最终链表的头指针和尾指针ListNode head = null;//头指针ListNode tail = null;//尾指针int up = 0;//进位数while (l1 != null || l2 != null) {int val1 = l1 == null ? 0 : l1.val;//当前l1指向的数值int val2 = l2 == null ? 0 : l2.val;//当前l2指向的数值int sum = val1 + val2 + up;//本轮计算结果if (head == null) {//第一次运算结果:初始化头指针和尾指针head = tail = new ListNode(sum % 10);//取模压入元素} else {//依次转入后续计算结果tail.next = new ListNode(sum % 10);tail = tail.next;//尾指针后移一位}up = sum / 10;//计算当前进位数大小if (l1 != null) {l1 = l1.next;//链表1往后取下一轮运算数}if (l2 != null) {l2 = l2.next;//链表2往后取下一轮运算数}}//whileif (up > 0) {//如果最后一轮还存在进位的情况tail.next = new ListNode(up);//在链表尾部添加进位数}//再反转结果return reverseList(head);//返回结果链表的头指针}
}