#leetcode445.链表求和


这道题之前刷剑指offer的时候没有遇到过,链表求和挺新奇的,一开始自己的思路其实是奔着递归去的,但是两个链表递归的长度不确定,感觉对齐链表的低位整数不太好做,所以,索性直接看了下大佬的思路,大致就是用两个栈存储链表中的整数,然后用加减法的代码做位数相加,然后进位再相加,最后用node还原出来链表;

代码如下:

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {

        Stack s1 = buildStack(l1);
        Stack s2 = buildStack(l2);

        ListNode head = new ListNode(-1);
        int carry = 0;

        while( !s1.isEmpty() || !s2.isEmpty() || carry!=0) {

            int z1= s1.isEmpty()? 0 : s1.pop();
            int z2 = s2.isEmpty()? 0 : s2.pop();
            int sum = z1 + z2 + carry;
            ListNode node = new ListNode(sum % 10);
            node.next = head.next;
            head.next = node;

            carry = sum / 10;
        }
        return head.next;
    }

    public Stack buildStack(ListNode node) {

        Stack stack = new Stack();

        while(node != null) {
            stack.push(node.val);
            node = node.next;
        }

        return stack;
    }

这道题有几个需要注意容易写错的地方??:

1、就是循环的入口条件、while(!s1.isEmpty() || !s2.isEmpty() || carry!=0) 为什么这样呢,因为两个链表不论哪个有值都需要创建node节点,另一个置为0相加就可以了,同样的道理,就算链表节点都没有了,如果进位还在的话,那么也需要将进位创建成节点存储起来,所以说 ||carry!=0也是必要的!

2、就是 int sum = l1 + l2 + carry  千万别忘记进位哈!最开始代码没通过就是因为自己下意识的以为l1 + l2就可以了,忘了carry进位的存在

基本就这两个地方需要注意