给定两个链表的头节点 head1和head2,认为从左到右是某个数字从低位到高位,返回相加之后的链表
例子: A链表 4 -> 3 -> 6 B链表:2 -> 5 -> 3
相加后结果: 6 -> 8 -> 9
解释:634 + 352 = 986;
分析:计算出两个链表的长度。从短链表先进行遍历。所以有以下几种情况(假设A链表长度比B链表长)
- A、B都没遍历完,有next指针(如果此时相加进位,则下一节点相加时需加上进位数)。
- B已经遍历完成,没有next指针,而A还有剩余节点(此时如果还有进位数,则A节点相加即可)。
- A、B都已经遍历完成(此时如果还有进位数,则需要构建新节点)。
由于是两个链表对应节点进行相加,所以还需要考虑进位的情况。
可以用两个节点相加%10的方式取模,其取模的数,即为两数相加后的数,用两个节点相加/10的方式,看是否需要进位,同时还要考虑的是,如果两个节点所有数相加完成后,进位变量不为0,则还需追加一个节点。
//获取Node的长度
public static int nodeLength(Node head) {
int len = 0;
while (head.next != null) {
len++;
head = head.next;
}
return len;
}
public static Node addDoubleNode(Node head1, Node head2) {
int len1 = nodeLength(head1);
int len2 = nodeLength(head2);
//将长的Node,赋给l,短的Node赋给s
Node l = len1 >= len2 ? head1 : head2;
Node s = l == head1 ? head2 : head1;
//申请两个临时变量,一会将对临时变量进行操作
Node curL = l;
Node curS = s;
//last节点是为了最后如果进位carry数不为0,则需要构建一个新的Node节点保证进位
Node last = curL;
int curNum = 0;
int carry = 0;
//因为S短L长,如果S不为null,L也必然不为null
while (curS != null) {
curNum = curL.value + curS.value + carry;
curL.value = (curNum % 10);
carry = curNum / 10;
last = curL;
curL = curL.next;
curS = curS.next;
}
while (curL != null) {
curNum = curL.value + carry;
curL.value = curNum % 10;
carry = curNum / 10;
last = curL;
curL = curL.next;
}
if (carry != 0) {
last.next = new Node(1);
}
return l;
}