两数相加 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
算法实现(方法一) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 package leetCode;import java.util.LinkedList;public class Two { public static void main (String[] args) { LinkedList<Integer> l1 = new LinkedList <>(); l1.add(9 ); l1.add(9 ); l1.add(9 ); l1.add(9 ); l1.add(9 ); l1.add(9 ); l1.add(9 ); System.out.println(l1); LinkedList<Integer> l2 = new LinkedList <>(); l2.add(9 ); l2.add(9 ); l2.add(9 ); l2.add(9 ); System.out.println(l2); System.out.println(addTwoNumbers(l1, l2)); } public static LinkedList<String> addTwoNumbers (LinkedList<Integer> l1, LinkedList<Integer> l2) { LinkedList<Integer> r1 = new LinkedList <>(); LinkedList<Integer> r2 = new LinkedList <>(); for (int size = l1.size(), i = 0 ; i < size; i++) { int tmp = l1.removeLast(); r1.add(tmp); } for (int size = l2.size(), i = 0 ; i < size; i++) { int tmp = l2.removeLast(); r2.add(tmp); } String str1 = r1.toString().substring(1 ); String str2 = str1.substring(0 , str1.length() - 1 ); String str3 = str2.replaceAll("," , "" ); String str4 = str3.replaceAll("\\s+" , "" ); int v1 = Integer.parseInt(str4); String str12 = r2.toString().substring(1 ); String str22 = str12.substring(0 , str12.length() - 1 ); String str32 = str22.replaceAll("," , "" ); String str42 = str32.replaceAll("\\s+" , "" ); int v2 = Integer.parseInt(str42); int sum = v1 + v2; LinkedList<String> result = new LinkedList <>(); String sumStr = sum + "" ; for (int i = 0 ; i < sumStr.length(); i++) { result.addFirst(String.valueOf(sumStr.charAt(i))); } return result; } }
相关知识 LinkedList 简介 链表(LinkedList)是一种常见的数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是每一个节点里存到下一个节点的地址。
链表可以分为单向链表和双向链表。
一个单项链表包含两个值:当前节点的值和指向下一个节点的链接。
一个双向链表由三个整数值:当前节点的值、向后的节点链接、前向的节点链接。
应用场景
需要循环迭代来访问列表中的某些元素。
需要频繁的在列表开头、中间、末尾等位置进行添加和删除元素操作。
代码示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 package dataStructure;public class LinkedList { public static void main (String[] args) { java.util.LinkedList<String> list = new java .util.LinkedList<>(); list.add("Google" ); list.add("Baidu" ); list.add("Weibo" ); list.addFirst("Apple" ); list.addLast("End" ); list.removeFirst(); list.removeLast(); System.out.println(list.getFirst()); System.out.println(list.getLast()); System.out.println(list); System.out.println(list.size()); for (int size = list.size(), i = 0 ; i < size; i++) { System.out.println(list.get(i)); } for (String str : list) { System.out.println(str); } } }
算法实现(方法二) 测试类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public static void main (String[] args) { ListNode listNode1 = new ListNode (1 ); ListNode listNode2 = new ListNode (3 , listNode1); ListNode listNode3 = new ListNode (6 , listNode2); ListNode listNode21 = new ListNode (2 ); ListNode listNode22 = new ListNode (3 , listNode21); ListNode listNode23 = new ListNode (6 , listNode22); ListNode listNode24 = new ListNode (9 , listNode23); ListNode listNode25 = new ListNode (9 , listNode24); ListNode result = sum(listNode3, listNode25); while (result != null ) { System.out.println(result.val); result = result.next; } }
方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 public static ListNode sum (ListNode l1, ListNode l2) { ListNode head1 = l1; ListNode head2 = l2; while (head1 != null ) { if (head2 != null ) { head1.val += head2.val; head2 = head2.next; } if (head1.next == null && head2 != null ) { head1.next = head2; break ; } head1 = head1.next; } merge(l1); return l1; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 public static void merge (ListNode listNode) { while (listNode != null ) { if (listNode.val >= 10 ) { listNode.val = listNode.val % 10 ; if (listNode.next == null ) { listNode.next = new ListNode (0 ); } listNode.next.val += 1 ; } listNode = listNode.next; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 package dataStructure;public class ListNode { public int val; public ListNode next; public ListNode (int val) { this .val = val; } public ListNode (int val, ListNode next) { this .val = val; this .next = next; } }
反思
首先,理解清晰题目考察的方向。暴力破解可行,但应该是最坏的打算!
明确解题的思路,即算法实现的步骤。
分阶段实现,测试。