最细思路讲解,代码流程带注释^_^
两个链表生成相加链表
http://www.nowcoder.com/questionTerminal/c56f6c70fb3f4849bc56e33ff2a50b6b
该题并无多大难度,只是需要理清楚整个的合并流程,理清楚后就是写代码优化代码的事情了
思路:
1.因为需要从后向前来确定每一位的值(因为有进位值),第一个想到的结构就应该是栈,然后分别将两个链表入栈,就能够保证一直是从最后进行合并。
2.分别入栈后,每次从两个栈中取出一个值,计算出进位值,并更新记录,取相加个位数创建当前节点,然后使用头插法插到头部,保存当前节点,然后循环操作
3.当处理完两个链表的合并,可能存在某一个栈为空且还有进位值,则可转换成2的流程进行最后的数据处理,最后返回头结点即可
好了,我们的思路已经非常清晰了,然后我们来代码实现吧,小弟能力有限,只能把代码优化到这个程度,各位大佬如果能够优化请评论提醒一下我*
public ListNode addInList (ListNode head1, ListNode head2) { // write code here //如果有一个为空则返回另外一个值 if(head1 == null)return head2; if(head2 == null)return head1; LinkedList<ListNode> stack1 = new LinkedList<>(); LinkedList<ListNode> stack2 = new LinkedList<>(); ListNode r1 = head1,r2 = head2,temp = null; int o = 0; //分别入栈 while(r1!=null){ stack1.addFirst(r1); r1 = r1.next; } while(r2!=null){ stack2.addFirst(r2); r2 = r2.next; } //开始合并节点 while(!stack1.isEmpty() && !stack2.isEmpty()){ //初始化节点 int num1 = stack1.pollFirst().val; int num2 = stack2.pollFirst().val; //创建当前位的节点 ListNode node = new ListNode((num1 + num2 +o)%10); //更新进位值 o = merge(num1,num2,o); //头插,更新最新头结点 node.next = temp; temp = node; } //处理两个栈可能出现剩余的情况 while(!stack1.isEmpty()){ int num = stack1.pollFirst().val; ListNode node = new ListNode((num+o)%10); o = merge(num,0,o); node.next = temp; temp = node; } while (!stack2.isEmpty()){ int num = stack2.pollFirst().val; ListNode node = new ListNode((num+o)%10); o = merge(num,0,o); node.next = temp; temp = node; } return temp; } //返回进位值 public int merge(int num1,int num2,int o){ return (num1 + num2 + o) / 10; }