给出两个 非空 的链表用来表示两个非负的整数。
其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
先了解了下ListNode:
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next; //链表指向的下一个值的指针
* public ListNode(int x) { val = x; } //赋值
* }
定义链表ListNode时,
1. 链表的首个值不能为0,当首个参数为0时,代表着链表为空。
2. 只需要定义一个ListNode xx = new ListNode(0);即可。即只定义一个空链表。
3. 不需要定义长度 。
赋值时,
1. 通过xx.next = new ListNode(4);来赋值,注意此时是赋值给下一个指针指向的位置,此时此链表一个值,值为4。
2. 通过一个链表指向原链表地址,赋值完成时,打印原链表的指针地址,获取所有值。
取值时,
1. 取第一个值时,只需要xx.val即可。
2. 取第二或之后的值时,需要xx = xx.next;int x = xx.val;这个方式取值。
解题: 时间复杂度:O(max(m,n)) m 和 n 分别表示 l1 和 l2 的长度
执行用时:152 ms 内存消耗:27.7 MB
public class Solution
{
public ListNode AddTwoNumbers(ListNode l1, ListNode l2)
{
int val = 0;
ListNode prenode = new ListNode(0); // 初始化
ListNode lastnode = prenode; //定义循环用的对象
while (l1 != null || l2 != null || val != 0)
{
val = val + (l1 == null ? 0 : l1.val) + (l2 == null ? 0 : l2.val); //计算两数之和 并加上前一轮需要进位的值
lastnode.next = new ListNode(val % 10); //计算个位,将数据添加到循环链表中
lastnode = lastnode.next; //循环用的对象赋值为循环链表中的下一个对象
val = val / 10;//计算十位并赋值
//l1 l2 指向自己在链表中对应的下一个值
l1 = l1 == null ? null : l1.next;
l2 = l2 == null ? null : l2.next;
}
return prenode.next;
}
}
class Test
{
static ListNode generateList(int[] vals)
{
ListNode res = null;
ListNode last = null;
foreach (var val in vals)
{
if (res == null)
{
res = new ListNode(val);
last = res;
}
else
{
last.next = new ListNode(val);
last = last.next;
}
}
return res;
}
static void printList(ListNode l)
{
while (l != null)
{
Console.Write($"{l.val}, ");
l = l.next;
}
Console.WriteLine("");
}
static void Main()
{
var l1 = generateList(new int[] { 2, 5, 8 });
var l2 = generateList(new int[] { 3, 6, 9, 1 });
printList(l1);
printList(l2);
Solution s = new Solution();
var sum = s.AddTwoNumbers(l1, l2);
printList(sum);
}
}