两个链表生成相加的链表

1.题目描述

假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。
给定两个这种链表,请生成代表两个整数相加值的结果链表。
例如:链表 1 为 9->3->7,链表 2 为 6->3,最后生成新的结果链表为 1->0->0->0。

2.题目分析

  • 本题的顺序与链表相加的顺序是相反的是本题的一个难点
  • 可以借助栈来存储链表的数
  • 依次把所有数字压入栈中,再依次取出相加。计算过程中需要进位的情况。
  • 注意处理前置0的情况,比如链表的长度不一样就需要加上前置0,比如937和63.做加法处理的时候就可以用栈的非空判断。

3.源代码

 import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param head1 ListNode类 
     * @param head2 ListNode类 
     * @return ListNode类
     */
    public ListNode addInList (ListNode head1, ListNode head2) {
       ListNode  dummyHead=new ListNode(-1);
                   ListNode  cur=dummyHead;
                   int  carry=0;
                   Stack<Integer>  stack1=new  Stack();
                   Stack<Integer>  stack2=new  Stack();
                     while(head1!=null){
                         stack1.push(head1.val);
                          head1=head1.next;
                     }
                   while(head2!=null){
                         stack2.push(head2.val);
                          head2=head2.next;
                     }
          while(!stack1.isEmpty()||!stack2.isEmpty()||carry!=0){
                           int  x=stack1.isEmpty()?0:stack1.pop();
                           int  y=stack2.isEmpty()?0:stack2.pop();
                           int  sum=x+y+carry;
                           carry=sum/10;
                           sum=sum%10;
                           cur.next=new ListNode(sum);
                           cur=cur.next;           
          }

        return   reverse(dummyHead.next);
    }
    ListNode  reverse(ListNode head){
          ListNode pre,cur,next;
          pre=null;
          cur=next=head;
        while(cur!=null){
              next=cur.next;
              cur.next=pre;
            pre=cur;
            cur=next;
        }
          return  pre;
    }
}

复杂度分析

  • 时间复杂度:O(max(m,n)),其中m和n分别为两个链表的长度。我们需要遍历两个链表的全部位置,而处理每个位置只需要 O(1) 的时间。
  • 空间复杂度:O(m+n),其中 m 和 n 分别为两个链表的长度。空间复杂度主要取决于我们把链表内容放入栈中所用的空间。