/**
* 两个链表相加
* @param p
* @param q
* @return
*/
public static ListNode doubleLinkListSumToLinkList(ListNode p, ListNode q) {
// 有一个为空,直接返回另一个
if (p == null ^ q == null) {
return p == null ? q : p
}
// 先计算两个链表的长度
int pSize = getLinkListSize(p)
int qSize = getLinkListSize(q)
// 长链表
ListNode ln = pSize > qSize ? p : q
// 短链表
ListNode sn = pSize > qSize ? q : p
ListNode lnPre = ln
ListNode snPre = sn
ListNode head = new ListNode(-1, null)
ListNode tail = head
// 相加
int over = 0
while (lnPre != null && snPre != null) {
// 求和
int sum = lnPre.value + snPre.value + over
// 生成新节点,值需要除以10,因为要进位
tail.next = new ListNode(sum % 10, null)
tail = tail.next
// 进位
over = sum / 10
lnPre = lnPre.next
snPre = snPre.next
}
// 短链表可能已经遍历完了,继续遍历长链表,进位
while (lnPre != null) {
// 求和
int sum = lnPre.value + over
// 生成新节点
tail.next = new ListNode(sum % 10, null)
tail = tail.next
// 进位
over = sum / 10
lnPre = lnPre.next
}
if (over > 0) {
tail.next = new ListNode(1, null)
}
return head.next
}
/**
* 得到链表长度
* @param node
* @return
*/
private static int getLinkListSize(ListNode node) {
int size = 0
ListNode prev = node
while (prev != null) {
size ++
prev = prev.next
}
return size
}
```
```