思路:
从题中给出的有效信息:
- 一个链表代表一个整数,返回多个链表的相加结果
故此顺位迭代就可以了,链表的问题大多借助栈和队列的结构思想
方法一:
具体做法:
申请两个栈空间和一个标记位,然后将两个栈中内容依次相加,将结果倒插入新节点中。
具体过程如下图所示:
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) { // write code here LinkedList<Integer> list1 = new LinkedList<>(); //list1栈 LinkedList<Integer> list2 = new LinkedList<>(); //list2栈 putData(list1, head1); //入栈 putData(list2, head2); ListNode newNode = null; ListNode head = null; int carry = 0; //标记进位 while(!list1.isEmpty() || ! list2.isEmpty() || carry != 0) { int x = (list1.isEmpty()) ? 0 : list1.pop(); //依次从栈中取出 int y = (list2.isEmpty()) ? 0 : list2.pop(); int sum = x + y + carry; //与进位一起相加 carry = sum / 10; //更新进位 //将计算值放入节点 newNode = new ListNode(sum % 10); //更新下一个节点的指向 newNode.next = head; head = newNode; } return head; } private static void putData(LinkedList<Integer> s1,ListNode head1) { if (s1 == null) s1 = new LinkedList<>(); //遍历节点将其插入栈中 while(head1 != null) { s1.push(head1.val); head1 = head1.next; } } }
复杂度分析:
- 时间复杂度:O(max(m,n)),由于只遍历了一次,只需要看两个链表更长的
- 空间复杂度:O(m+n),申请了两个栈来记录元素
思路:
方法二:暴力搜索(不推荐,测试案例已超时)
具体做法:
将其转为字符串相加以后,然后构造链表;
具体过程如下图所示:
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) { // write code here StringBuilder num1 = new StringBuilder(); StringBuilder num2 = new StringBuilder(); //将链表用字符串拼接 while (head1 != null) { num1.append(head1.val); head1 = head1.next; } while (head2 != null) { num2.append(head2.val); head2 = head2.next; } //将字符串用BigInteger转换进行计算 java.math.BigInteger i = (new java.math.BigInteger(num1.toString())).add(new java.math.BigInteger(num2.toString())); String str = i + ""; ListNode ans = new ListNode(-1); ListNode iter = ans; //最后转换为链表 for (int j = 0; j < str.length(); j++) { iter.next = new ListNode(str.charAt(j) - '0'); iter = iter.next; } return ans.next; } }
复杂度分析:
- 时间复杂度:O(m+n) ,需要遍历两次,然后相加
- 空间复杂度:O(m+n) ,创建了多个n+m个节点空间