两个链表相加生成相加链表
这道题总是报超时,一样的结题思路以及方法,但是总是无法AC,一直75%,报超时(可能太菜代码优化不够)。但总体思路没得问题的。

  • 第一种解法
  1. 因为两个数相加的话,无法直接判断是否有进位以及位数是否相等,所以只能从个位向前相加,所以这个刚好符合栈的特性。所以创建两个栈来接收两个链表。
  2. 从后向前相加的数学逻辑:定义一个数 carry 用来计数进位之后的数(初始为0),之后每次在循环体内进行赋值为 sum / 10,定义 num1,num2,来接收每次出栈的元素,定义 sum 等于 num1 + num2 + carry(重点:carry 初始为0,每轮循环内对 carry 进行赋值除 为 sum / 10,如果进位的话则取值为1,刚好可以用来下一轮循环相加,如果没有进位的话取值为0,相当于没有进位,没有相加),定义 num 为 sum % 10,用来记录每轮循环两个数相加的各位。
  3. 最后随着循环创建 ListNode node = new ListNode(num),然后在循环体外创建一个链表 node2 用来指向 node,然后同时定义一个链表 result 用来指向 node2。
  4. 最后反转链表即可。

    代码优化地方:可以在循环体内每次创建新的链表的时候,直接在接收的时候让链表反向指向,从而使最后生成的链表就是最后的结果,不用最后反转链表。
    代码如下:

    ```
    public ListNode addInList (ListNode head1, ListNode head2) {
     // write code here
     //定义两个栈,用来存放两个链表的元素,刚好其结构特性符合相加的步骤
     Stack<Integer> stack1 = new Stack<>();
     Stack<Integer> stack2 = new Stack<>();
     //往栈里面添加元素
     ListNode node1 = head1;
     ListNode node2 = head2;
     while (node1 != null) {
         stack1.add(node1.val);
         node1 = node1.next;
     }
     while (node2 != null) {
         stack2.add(node2.val);
         node2 = node2.next;
     }
     //开始相加
     int carry = 0;
     ListNode node = new ListNode(0);
     ListNode result = node;
     while(!stack1.empty() || !stack2.empty() || carry != 0) {
         int a = 0;
         int b = 0;
         if (!stack1.empty()) {
             a = stack1.peek();
             stack1.pop();
         }
         if (! stack2.empty()) {
             b = stack2.peek();
             stack2.pop();
         }
         int sum = a + b + carry;
         int num = sum % 10;
         carry  = sum / 10;
         ListNode nodeNum = new ListNode(num);
         node.next = nodeNum;
         node = node.next;
     }
     result = result.next;
     ListNode pre = result;
     ListNode next = null;
     while (result !=null) {
         pre = result.next;
         result.next = next;
         next = result;
         result = pre;
     }
     return next;
  • 第二种思路
    不仁不义法。在整体解法:疯狂转换。
  1. 创建两个 list1,list2 来接收两个链表,然后直接转 String,转Integer,然后直接相加,然后将相加的结果直接转String,然后最后截止创建链表接收。
  2. 但是内存开销有点大,属于可以结题的一种思路。