leetcode002两数相加
题目描述:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807
解题思路:
1. 对边界进行判断,如果任意一个链表位空,都返回另一个链表即可
2. 创建一个新的结点root,指向其中的任意链表(为了降低空间复杂度),代码中指向链表1
3. 创建一个结点r,指向链表1的前一个结点
4. 依次同时遍历两个链表,并将指向的结点的数值进行求和,并通过和保存和的进位。代码中运用sum/10得进位,sum%10求得和
5. 在运动过程中,r也要跟着移动
时间复杂度O(len(l1)+len(l2))
空间复杂度O(1) 创建了2个ListNode结点和一个flag
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { if (l1 == null) { return l2; } if (l2 == null) { return l1; } ListNode p1 = l1; ListNode p2 = l2; // 头结点 ListNode root = new ListNode(0); // r用来指向p1的前一个指针 ListNode r = root; // 为了不开辟空间,将root指向l1链表 root.next = l1; // 是否产生进位标志 int flag = 0; int sum = 0; while(p1 != null && p2 != null) { sum = p1.val + p2.val + flag; // 当前位的结果, 可能和大于等于10,将当前结果存储到p1指向的节点中 p1.val = sum % 10; // 当前位是否产生进位 flag = sum / 10; // r始终指向p1的前一个节点 r = r.next; p1 = p1.next; p2 = p2.next; } if (p1 == null) { r.next = p2; } else { r.next = p1; } // 最后一次相加可能存在进位 1 后面如果是999可能会连续产生进位 if (flag == 1) { while(r.next != null) { sum = r.next.val + flag; r.next.val = sum % 10; flag = sum / 10; r = r.next; } // 如果最后一位产生了进位说明比原来链表中最长的链表长一位 if (flag == 1) { r.next = new ListNode(1); } } return root.next; } }

浙公网安备 33010602011771号