#leetcode445.链表求和
这道题之前刷剑指offer的时候没有遇到过,链表求和挺新奇的,一开始自己的思路其实是奔着递归去的,但是两个链表递归的长度不确定,感觉对齐链表的低位整数不太好做,所以,索性直接看了下大佬的思路,大致就是用两个栈存储链表中的整数,然后用加减法的代码做位数相加,然后进位再相加,最后用node还原出来链表;
代码如下:
public ListNode addTwoNumbers(ListNode l1, ListNode l2) { Stacks1 = 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进位的存在
基本就这两个地方需要注意