算法:两个链表相加

148 阅读1分钟

/**
 * 两个链表相加
 * @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;
}
```
```