package cn.edu.xidian.sselab;
import java.util.ArrayList;/** * title:Add Two Numbers * content: * You are given two linked lists representing two non-negative numbers. * The digits are stored in reverse order and each of their nodes contain a single digit. * Add the two numbers and return it as a linked list. * Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) * Output: 7 -> 0 -> 8 */public class AddTwoNumbers { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub AddTwoNumbers atn = new AddTwoNumbers(); ListNode l1 = atn.new ListNode(5); ListNode l2 = atn.new ListNode(5); ListNode ls = AddTwoNumbers.addTwoNumbers(l1, l2); System.out.println(ls.val); System.out.println(ls.next.val); } class ListNode{ int val; ListNode next; public ListNode(int x){ val = x; } } //自己的思路,一开始:定义一个ListNode对象,让他指向l1,结果发现l1在不断的变化,这个对象也跟着一起到了队尾,然后就发现通过这种 //这种指向方法而不创建对象来做是不可行的 //接下来换了第二种思路,没加一次就创建一个保存和的对象,然后把这些对象都放到List容器里面,最后建立对象之间的链表关系,拿出第一个对象 //作为返回值就可以了。 //这里用到了数据结构里面最基本的方法,三个while循环,加一个判断最后一个节点根据进位值要不要新建 public static ListNode addTwoNumbers(ListNode l1,ListNode l2){ int temp = 0; int trade = 0; int tail = 0; ArrayList<ListNode> arr = new ArrayList<ListNode>(); while(l1 != null && l2 != null){ temp = l1.val + l2.val + trade; tail = temp % 10; trade = temp / 10; AddTwoNumbers atn = new AddTwoNumbers(); ListNode ll = atn.new ListNode(tail); arr.add(ll); l1 = l1.next; l2 = l2.next; } while(l1 != null){ temp = l1.val + trade; tail = temp % 10; trade = temp / 10; AddTwoNumbers atn = new AddTwoNumbers(); ListNode ll = atn.new ListNode(tail); arr.add(ll); l1 = l1.next; } while(l2 != null){ temp = l2.val + trade; l1 = l2; tail = temp % 10; trade = temp / 10; AddTwoNumbers atn = new AddTwoNumbers(); ListNode ll = atn.new ListNode(tail); arr.add(ll); l2 = l1.next; } if(trade != 0){ AddTwoNumbers atn = new AddTwoNumbers(); ListNode last = atn.new ListNode(trade); arr.add(last); l1 = last; } int len = arr.size(); for(int i=0;i<len-1;i++){ arr.get(i).next = arr.get(i+1); } return arr.get(0); } //参考别人的思路,通过直接新建一个链,思路非常明确,而且很巧妙,将我原来的三个while循环合并成一个循环了。 public ListNode addTwoNumber(ListNode l1,ListNode l2){ ListNode result = new ListNode(0); ListNode temp = result; int sum = 0; while(l1 != null || l2 != null){ sum /= 10; if(l1 != null){ sum += l1.val; l1 = l1.next; } if(l2 != null){ sum += l2.val; l2 = l2.next; } temp.next = new ListNode(sum % 10); temp = temp.next; } if(sum / 10 == 1){ temp.next = new ListNode(1); } return result.next; } }