使用两个栈来实现链表加法
两个链表生成相加链表
http://www.nowcoder.com/questionTerminal/c56f6c70fb3f4849bc56e33ff2a50b6b
首先考虑两个数字相加之后结果的长度只有两种情况,假设n1 + n2 = res,n1 的长度是 l1, n2 的长度是 l2,res 的长度只可能为两种情况,case1:max(l1, l2),比如123+456=579; case2: max(l1, l2)+1,比如1+999=1000。基于上述分析,可得出总体思路如下:
1、使用两个栈结构存储链表数据,根据栈的特性,弹出的顺序挣好就是从个位开始到高位的顺序。
2、根据栈的长度可以分别确定两个链表的长度,即两个数的位数。
3、编写addCore(Stack<listnode> s1, Stack<listnode> s2)方法,此时通过上层调用处的处理,可以确保s1的长度是大于s2的长度的,相加之后的结果保存在s1弹出的节点中,即在原来较长的链表中直接修改数值位结果值。最后如果inc==1,也就是说全部相加之后还有进位,意味着长度要+1,所以创建新节点,并指向上次弹出的节点,并返回该节点,否则直接返回上次弹出的节点。</listnode></listnode>
public ListNode addInList (ListNode head1, ListNode head2) { // write code here if(head1==null || head2==null){ return head1==null ? head2 : head1; } Stack<ListNode> s1 = new Stack<>(); Stack<ListNode> s2 = new Stack<>(); ListNode n1 = head1, n2 = head2; while(n1!=null){ s1.push(n1); n1 = n1.next; } while(n2!=null){ s2.push(n2); n2 = n2.next; } return s1.size()>s2.size() ? addCore(s1, s2) : addCore(s2, s1); } private ListNode addCore(Stack<ListNode> s1, Stack<ListNode> s2){ int inc = 0, ans = 0; ListNode t = null; while(s1.size()!=0 && s2.size()!=0){ t = s1.pop(); ans = t.val + s2.pop().val + inc; inc = ans>=10 ? 1 : 0; t.val = ans % 10; } while(s1.size()!=0){ t = s1.pop(); ans = t.val + inc; inc = ans>=10 ? 1 : 0; t.val = ans % 10; } if(inc==1){ ListNode head = new ListNode(inc); head.next = t; return head; } return t; }