两数相加
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
/** * Definition for singly-linked list. * 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; } * } */ class Solution { public ListNode addTwoNumbers(ListNode head1, ListNode head2) { int ca = 0; int n1 = 0; int n2 = 0; int n = 0; ListNode c1 = head1; ListNode c2 = head2; ListNode node = null; ListNode pre = null; while (c1 != null || c2 != null) { //c1,c2分别指上下两数 n1 = c1 != null ? c1.val : 0; //如果c1或c2为空就补0(当链表长度不一) n2 = c2 != null ? c2.val : 0; n = n1 + n2 + ca; pre = node; node = new ListNode(n % 10); node.next = pre; // 指针向前一个节点 ca = n / 10; //ca:进位 c1 = c1 != null ? c1.next : null; c2 = c2 != null ? c2.next : null; } if (ca == 1) { //如果结尾仍有进位,则加一个1节点 pre = node; node = new ListNode(1); node.next = pre; } return reverseList(node); //将链表逆序 } public static ListNode reverseList(ListNode head) { ListNode pre = null; ListNode next = null; while (head != null) { next = head.next; head.next = pre; pre = head; head = next; } return pre; } }
2022-02-14