两数相加
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
package com.wb.magic.leetcode.queue;
/**
* 两数相加
* 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
* 请你将两个数相加,并以相同形式返回一个表示两数之和的新链表。
*/
public class AddNumberTogether<E> {
transient int size = 0;
transient ListNode<E> first;
transient ListNode<E> last;
public ListNode<Integer> addTwoNumbers(ListNode<Integer> listNode1,ListNode<Integer> listNode2){
//初始化伪指针
ListNode<Integer> prev = new ListNode<>(0);
//创建可移动的指针,当前和伪指针指向一个位置
ListNode<Integer> cur=prev;
ListNode<Integer> p=listNode1,q=listNode2;
//记录进位
int up=0;
while (p!=null||q!=null){
int val1=p==null?0:p.getItem();
int val2=q==null?0:q.getItem();
//求和
int sum=val1+val2+up;
up=sum/10;
sum=sum%10;
//创建节点
cur.next=new ListNode<Integer>(sum);
//移动指针
cur=cur.next;
if(p!=null){
p=p.next;
}
if(q!=null){
q=q.next;
}
}
if(up==1){
//如何最高位需要进位
cur.next=new ListNode<>(up);
//设置头节点
}
return prev.next;
}
void linkFirst(E e){
final ListNode<E> f=first;
final ListNode<E>newNode=new ListNode<>(null,e,f);
first=newNode;
}
private class ListNode<E> {
E item;
ListNode<E> next;
ListNode<E> prev;
public ListNode(E item) {
this.item = item;
}
public ListNode(ListNode<E> next, ListNode<E> prev) {
this.next = next;
this.prev = prev;
}
public ListNode(ListNode<E> prev, E element, ListNode<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
public E getItem() {
return item;
}
public void setItem(E item) {
this.item = item;
}
}
}