链表相加
描述
假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。
给定两个这种链表,请生成代表两个整数相加值的结果链表。
数据范围:0≤n,m≤1000000,链表任意值0≤val≤9
要求:空间复杂度 O(n),时间复杂度 O(n)
例如:链表 1 为 9->3->7,链表 2 为 6->3,最后生成新的结果链表为 1->0->0->0。
示例1
输入:[9,3,7],[6,3]
返回值:{1,0,0,0}
示例2
输入:[0],[6,3]
返回值:{6,3}
备注:
1≤n,m≤
1
0
6
10^6
106
0≤ai ,bi ≤9
思路
由于链表的特性,所有针对链表尾的计算都是很复杂的。而常规的加法就是从最后一位开始加和的。为了处理这种情况,想到可以将两个链表先进行翻转,从第一位开始加和。得到的结果链表再做一次翻转。
public ListNode reverseList(ListNode head){//一个链表翻转的函数
ListNode pre = null;
ListNode cur = head;
ListNode next = null;
while(cur!=null){
next = cur.next;
cur.next=pre;
pre = cur;
cur = next;
}
return pre;
}
public ListNode addInList (ListNode head1, ListNode head2) {
ListNode new1 = reverseList(head1);
ListNode new2 = reverseList(head2);
ListNode NewList = new ListNode(-1);//结果链表
ListNode cur = NewList;
int carry=0;//进位信息
while(new1!=null &&new2!=null){
int val = (new1.val+new2.val+carry)%10;
ListNode NewNode = new ListNode(val);
cur.next = NewNode;
cur = cur.next;
carry = (new1.val+new2.val+carry)/10;
new1 = new1.next;
new2 = new2.next;
}
while(new1!=null){
int val = (new1.val+carry)%10;
ListNode NewNode = new ListNode(val);
cur.next = NewNode;
cur = cur.next;
carry = (new1.val+carry)/10;
new1 = new1.next;
}
while(new2!=null){
int val = (new2.val+carry)%10;
ListNode NewNode = new ListNode(val);
cur.next = NewNode;
cur = cur.next;
carry = (new2.val+carry)/10;
new2 = new2.next;
}
return reverseList(NewList.next);
}