问题如下:
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807
分析问题,本题是一个链表的问题。示例是输入两个三位数相加,这个三位数来自于链表的倒序组成的数,然后输出的结果也是这个和的个十百位上面的数。
首先,我们要排除非法链表的输入,即链表一和链表二 非空 且长度一致才可以。
public static ListNode AddTwoNumbers(ListNode l1, ListNode l2) { ListNode result = new ListNode(0); if(l1 == null || l2 == null) { return null; } int l1Count = 0; ListNode lTmp = new ListNode(0); List<int> list1 = new List<int>();//用来临时存放数字 List<int> list2 = new List<int>();//用来临时存放数字 lTmp = l1; while(lTmp != null) { list1.Add(lTmp.val); l1Count++; lTmp = lTmp.next; } int l2Count = 0; lTmp = l2; while (lTmp != null) { list2.Add(lTmp.val); l2Count++; lTmp = lTmp.next; } int lcount = 0; if(l1Count > l2Count) { lcount = l1Count; } else { lcount = l2Count; } int carry = 0;//表示进位 ListNode resultTmp = new ListNode(0); resultTmp = result; for (int i=0;i< lcount; i++) { int l1Num = 0; if (list1.Count > i) { l1Num = list1[i]; } int l2Num = 0; if(list2.Count > i) { l2Num = list2[i]; } int sum = l1Num + l2Num; if(carry > 0) { sum += carry; } int num = 0; if(sum >= 10) { num = sum - 10; carry = 1; } else { num = sum; carry = 0; } resultTmp.next = new ListNode(num); //这里面比较难理解,链表传递的是地址。 resultTmp = resultTmp.next;//所以一个链表移动位置,另外一个链表也跟着移动(但主链表是依次赋值) } if(carry > 0) { resultTmp.next = new ListNode(carry); resultTmp = resultTmp.next; } return result.next; }