假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。
给定两个这种链表,请生成代表两个整数相加值的结果链表。
例如:链表 1 为 9->3->7,链表 2 为 6->3,最后生成新的结果链表为 1->0->0->0。
第一行两个整数 n 和 m,分别表示两个链表的长度。
第二行 n 个整数 ai 表示第一个链表的节点。
第三行 m 个整数 bi 表示第二个链表的节点。
输出一行整数表示结果链表。
3 2 9 3 7 6 3
1 0 0 0
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; class ListNode { int val; ListNode next; public ListNode(int val) { this.val = val; this.next = null; } } public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] params = br.readLine().trim().split(" "); int n = Integer.parseInt(params[0]), m = Integer.parseInt(params[1]); String[] list1 = br.readLine().trim().split(" "); String[] list2 = br.readLine().trim().split(" "); ListNode head1 = new ListNode(Integer.parseInt(list1[0])); ListNode head2 = new ListNode(Integer.parseInt(list2[0])); ListNode cur1 = head1, cur2 = head2; for(int i = 1; i < list1.length; i++){ cur1.next = new ListNode(Integer.parseInt(list1[i])); cur1 = cur1.next; } for(int i = 1; i < list2.length; i++){ cur2.next = new ListNode(Integer.parseInt(list2[i])); cur2 = cur2.next; } ListNode result = add(reverse(head1), reverse(head2)); result = reverse(result); while(result != null){ System.out.print(result.val + " "); result = result.next; } } private static ListNode reverse(ListNode cur) { ListNode prev = null; while(cur != null){ ListNode temp = cur.next; cur.next = prev; prev = cur; cur = temp; } return prev; } private static ListNode add(ListNode cur1, ListNode cur2) { ListNode result = new ListNode(-1); ListNode head = result; int carry = 0; // 进位数 while(cur1 != null && cur2 != null){ int val = cur1.val + cur2.val + carry; result.next = new ListNode(val % 10); carry = val / 10; result = result.next; cur1 = cur1.next; cur2 = cur2.next; } while(cur1 != null){ int val = cur1.val + carry; result.next = new ListNode(val % 10); carry = val / 10; result = result.next; cur1 = cur1.next; } while(cur2 != null){ int val = cur2.val + carry; result.next = new ListNode(val % 10); carry = val / 10; result = result.next; cur2 = cur2.next; } if(carry > 0) result.next = new ListNode(carry); return head.next; } }
# include <bits/stdc++.h> using namespace std; struct list_node{ int val; struct list_node * next; }; list_node * input_list(int n) { int val; list_node * phead = new list_node(); list_node * cur_pnode = phead; for (int i = 1; i <= n; ++i) { scanf("%d", &val); if (i == 1) { cur_pnode->val = val; cur_pnode->next = NULL; } else { list_node * new_pnode = new list_node(); new_pnode->val = val; new_pnode->next = NULL; cur_pnode->next = new_pnode; cur_pnode = new_pnode; } } return phead; } int get_length(list_node *head){ int l = 0; while(head){ l++; head = head->next; } return l; } list_node * add(list_node *head1, list_node *head2){ list_node *p1 = head1, *p2 = head2; int s = 0, t=0; while(p1 && p2){ s = p1->val + p2->val + t; p1->val = s%10; t = s/10; if(p1->next==NULL && t){ list_node *q = new list_node(); q->val = t; p1->next = q; t = 0; return head1; } p1 = p1->next; p2 = p2->next; } while(p1){ s = p1->val + t; p1->val = s%10; t = s/10; if(p1->next==NULL && t){ list_node *q = new list_node(); q->val = t; p1->next = q; return head1; } p1 = p1->next; } return head1; } list_node * reverse_list(list_node *head){ list_node *L=nullptr, *p = head; while(head){ p = head->next; head->next = L; L = head; head = p; } return L; } list_node * add_list(list_node * head1, list_node * head2) { int n = get_length(head1); int m = get_length(head2); if(n < m) swap(head1, head2); head1 = reverse_list(head1); head2 = reverse_list(head2); list_node *head = add(head1, head2); return reverse_list(head); } void print_list(list_node * head) { while (head != NULL) { printf("%d ", head->val); head = head->next; } puts(""); } int main () { int n, m; scanf("%d%d", &n, &m); list_node * head1 = input_list(n), * head2 = input_list(m); list_node * new_head = add_list(head1, head2); print_list(new_head); return 0; }
list_node *reverseList(list_node *head){ list_node *pre =nullptr; list_node *cur =head; list_node *temp; while(cur){ temp =cur->next; cur->next =pre; pre =cur; cur=temp; } return pre; } list_node * add_list(list_node * head1, list_node * head2) { //////在下面完成代码 if(head1==nullptr)return head2; if(head2==nullptr)return head1; list_node *dummynode =new list_node(0); list_node *head =dummynode; head1 =reverseList(head1); head2 =reverseList(head2); int carry=0; while(head1!=nullptr||head2!=nullptr){ int sum =carry; if(head1){ sum+=head1->val; head1=head1->next; } if(head2){ sum+=head2->val; head2 =head2->next; } carry=sum/10; head->next =new list_node(sum%10); head =head->next; } if(carry>0){ head->next =new list_node(carry); } return reverseList(dummynode->next); }
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int m = sc.nextInt(); Node head1 = input(sc, n); Node head2 = input(sc, m); head1 = reverse(head1); head2 = reverse(head2); Node ret = null, p = null; int c = 0; // 进位 Node p1 = head1; Node p2 = head2; while(p1 != null || p2 != null || c != 0) { int sum = (p1 == null ? 0: p1.val) + (p2 == null ? 0: p2.val) + c; if (sum >= 10) { sum -= 10; c = 1; } else { c = 0; } if (ret == null) { ret = p = new Node(sum); } else { p.next = new Node(sum); p = p.next; } p1 = p1 == null ? null: p1.next; p2 = p2 == null ? null: p2.next; } p = ret = reverse(ret); StringBuilder cache = new StringBuilder(); while(p != null) { cache.append(p.val).append(" "); p = p.next; } if (cache.length() > 0) { cache.deleteCharAt(cache.length() - 1); } System.out.println(cache); } private static Node input(Scanner sc, int n) { Node head = null, p = null; for (int i = 0; i < n; ++i) { if (head == null) { head = p = new Node(sc.nextInt()); } else { p.next = new Node(sc.nextInt()); p = p.next; } } return head; } private static Node reverse(Node head) { if (head == null) return null; Node pre = head; Node cur = head.next; Node next = null; while (cur != null) { next = cur.next; cur.next = pre; pre = cur; cur = next; } head.next = null; return pre; } } class Node { int val; Node next; Node(int val) { this.val = val; } }
直接套用高精度加法模板
import java.io.*; public class Main { static int n, m; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); String[] str = br.readLine().split(" "); n = Integer.parseInt(str[0]); m = Integer.parseInt(str[1]); Node h1 = new Node(-1); Node p = h1; String[] s1 = br.readLine().split(" "); for (int i = 0; i < n; i++) { p.next = new Node(Integer.parseInt(s1[i])); p = p.next; } h1 = h1.next;//真实头结点 h1 = revers(h1); Node h2 = new Node(-1); p = h2; String[] s2 = br.readLine().split(" "); for (int i = 0; i < m; i++) { p.next = new Node(Integer.parseInt(s2[i])); p = p.next; } h2 = h2.next;//真实头结点 h2 = revers(h2); Node h = addList(h1, h2); h = revers(h); while (h != null) { bw.write(h.val + " "); h = h.next; } bw.newLine(); bw.flush(); } private static Node addList(Node h1, Node h2) { Node h = new Node(-1); Node hh = h; Node p = h1, q = h2; int t = 0; while (p != null || q != null) { if (p != null) { t += p.val; p = p.next; } if (q != null) { t += q.val; q = q.next; } hh.next = new Node(t % 10); t /= 10; hh = hh.next; } if (t > 0) { hh.next = new Node(1); hh = hh.next; } return h.next; } private static Node revers(Node h) { Node cur = h; Node next = null; Node pre = null; while (cur != null) { next = cur.next; cur.next = pre; pre = cur; cur = next; } return pre; } } class Node { int val; Node next; public Node(int val) { this.val = val; } }
import java.util.Scanner; import java.util.Stack; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int m = sc.nextInt(); Stack<Integer> s1 = new Stack<>(); Stack<Integer> s2 = new Stack<>(); Stack<Integer> s3 = new Stack<>(); for (int i = 0; i < n; i++) { s1.push(sc.nextInt()); } for (int i = 0; i < m; i++) { s2.push(sc.nextInt()); } int carry =0; while(!s2.isEmpty()||!s1.isEmpty()){ int a = s1.isEmpty()?0:(int)s1.pop(); int b = s2.isEmpty()?0:(int)s2.pop(); int c = a+b+carry; s3.push(c%10); carry = c / 10; } if(carry!=0) s3.push(carry); while (!s3.isEmpty()) { System.out.print(s3.pop()+" "); } } }
package Linked_List; /* *case通过率为75.00% */ import java.util.Scanner; class PNode2 { int val; PNode2 pre; PNode2 next; public PNode2(int data) { this.val = data; } public void setNode(PNode2 pre) { this.pre =pre; } public void setNext(PNode2 next) { this.next =next; } } public class Main { public PNode2 addLinkedList(PNode2 nrear, PNode2 mrear) { PNode2 ntemp =nrear; PNode2 mtemp =mrear; PNode2 head = new PNode2(0); PNode2 tmp =null; int decade=0; int unit =0; int up1=0; int up2=0; int up3=0; while(ntemp.pre !=null && mtemp.pre !=null) { up1=decade; decade=(ntemp.pre.val+mtemp.pre.val+up1)/10; unit=(ntemp.pre.val+mtemp.pre.val+up1)%10; PNode2 node = new PNode2(unit); node.setNext(tmp); tmp = node; ntemp =ntemp.pre; mtemp =mtemp.pre; } while(ntemp.pre !=null &&mtemp.pre ==null) { up2=decade; decade=(ntemp.pre.val+up2)/10; unit=(ntemp.pre.val+up2)%10; PNode2 node = new PNode2(unit); node.setNext(tmp); tmp = node; ntemp =ntemp.pre; } while(ntemp.pre ==null &&mtemp.pre !=null) { up3=decade; decade=(mtemp.pre.val+up3)/10; unit=(mtemp.pre.val+up3)%10; PNode2 node = new PNode2(unit); node.setNext(tmp); tmp = node; mtemp =mtemp.pre; } head.setNext(tmp); head.val =decade; return head; } public static void main(String[] args) { Scanner scan = new Scanner(System.in); //LinkedList1 PNode2 nrear = new PNode2(0); PNode2 npre = null; int n = scan.nextInt(); int m = scan.nextInt(); for(int i=0;i<n;i++) { PNode2 new_node = new PNode2(scan.nextInt()); new_node.setNode(npre); npre =new_node; } nrear.setNode(npre); //LinkedList2 PNode2 mrear = new PNode2(0); PNode2 mpre = null; for(int i=0;i<m;i++) { PNode2 new_node = new PNode2(scan.nextInt()); new_node.setNode(mpre); mpre =new_node; } mrear.setNode(mpre); Main mall = new Main(); PNode2 head_new =mall.addLinkedList(nrear, mrear); PNode2 new_temp=head_new; if(new_temp.val !=0) { System.out.print(head_new.val+" "); } while(new_temp.next !=null) { System.out.print(new_temp.next.val+" "); new_temp = new_temp.next; } } }
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Stack; public class Main { public static class Node { public int value; public Node next; public Node(int value) { this.value = value; } } public static Node addLists1(Node head1, Node head2) { head1 = reverseList(head1); head2 = reverseList(head2); int sum = 0; int n1 = 0; int n2 = 0; int carry = 0; Node cur1 = head1; Node cur2 = head2; Node node = null; Node next = null; while (cur1 != null || cur2 != null) { n1 = cur1 == null ? 0 : cur1.value; n2 = cur2 == null ? 0 : cur2.value; sum = n1 + n2 + carry; node = new Node(sum % 10); node.next = next; next = node; carry = sum / 10; cur1 = cur1 == null ? null : cur1.next; cur2 = cur2 == null ? null : cur2.next; } if (carry == 1) { node = new Node(1); node.next = next; } reverseList(head1); reverseList(head2); return node; } private static Node reverseList(Node head) { Node pre = null; Node next = null; while (head != null) { next = head.next; head.next = pre; pre = head; head = next; } return pre; } public static Node listGenerator(int length, String[] numbers) { Node head = new Node(Integer.parseInt(numbers[0])); Node cur = head; for (int i = 1; i < length; i++) { cur.next = new Node(Integer.parseInt(numbers[i])); cur = cur.next; } cur.next = null; return head; } public static void printList(Node head) { while (head != null) { System.out.print(head.value +" "); head = head.next; } System.out.println(); } public static void main(String[] args) throws IOException { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); String[] parameters = bufferedReader.readLine().split(" "); int n = Integer.parseInt(parameters[0]); int m = Integer.parseInt(parameters[1]); String[] numbers1 = bufferedReader.readLine().split(" "); String[] numbers2 = bufferedReader.readLine().split(" "); Node head1 = listGenerator(n, numbers1); Node head2 = listGenerator(m, numbers2); Node head = addLists1(head1, head2); printList(head); } }
list_node* revered_list(list_node* head){ if(head == NULL || head->next == NULL) return head; else{ list_node* temp = head->next; head->next = NULL; list_node* new_head = revered_list(temp); temp->next = head; return new_head; } } list_node * add_list(list_node * head1, list_node * head2, int n, int m) { //////在下面完成代码 head1 = revered_list(head1); head2 = revered_list(head2); int cur = 0; int flag = 0; int num1, num2, new_num; list_node* ans = new list_node(); ans->val = 0; ans->next = NULL; list_node* cur_node = ans; while(cur < n || cur < m){ if(head1){ num1 = head1->val; head1 = head1->next; } else num1 = 0; if(head2){ num2 = head2->val; head2 = head2->next; } else num2 = 0; new_num = num1 + num2 + flag; if(new_num >= 10) flag = 1; else flag = 0; new_num = new_num % 10; list_node* temp = new list_node(); temp->val = new_num; temp->next = NULL; cur_node->next = temp; cur_node = cur_node->next; cur++; } if(flag){ list_node* temp = new list_node(); temp->val = 1; temp->next = NULL; cur_node->next = temp; } ans = revered_list(ans->next); return ans; }
list_node * add_list(list_node * head1, list_node * head2) { //////在下面完成代码 //----START---- list_node *result = NULL, *new_pnode; int *h1 = new int[1000000]; int *h2 = new int[1000000]; int *h3 = new int[1000000]; int i = 1000000, j = 1000000, k = 0, c = 0; while (head1) { h1[--i] = head1->val; head1 = head1->next; } while (head2) { h2[--j] = head2->val; head2 = head2->next; } while (i < 1000000 && j < 1000000) { h3[k++] = (h1[i] + h2[j] + c) % 10; c = (h1[i] + h2[j] + c) / 10; ++i; ++j; } while (i < 1000000) { h3[k++] = (h1[i] + c) % 10; c = (h1[i] + c) / 10; ++i; } while (j < 1000000) { h3[k++] = (h2[j] + c) % 10; c = (h2[j] + c) / 10; ++j; } if (c > 0) { h3[k++] = c; } for (c = 0; c < k; ++c) { new_pnode = new list_node(); new_pnode->val = h3[c]; new_pnode->next = NULL; if (result == NULL) { result = new_pnode; } else { new_pnode->next = result; result = new_pnode; } } return result; //-----END----- }
时间复杂度太大,只能通过80%的用例
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Stack; class ListNode{ int value; ListNode next; public ListNode(int value){ this.value = value; } static ListNode convertArrayToLink(int[] arr){ ListNode dummyNode = new ListNode(-1); ListNode rear = dummyNode; for (int i = 0; i < arr.length; i++) { rear.next = new ListNode(arr[i]); rear = rear.next; } return dummyNode.next; } static void printLink(ListNode head){ while (head != null){ System.out.print(head.value + " "); head = head.next; } } } public class Main { ListNode addLists(ListNode head1, ListNode head2){ Stack<Integer> num1 = linkToStack(head1); Stack<Integer> num2 = linkToStack(head2); Stack<Integer> sum = new Stack<>(); int carry = 0; while (!num1.isEmpty() && !num2.isEmpty()){ int elementFromNum1 = num1.pop(); int elementFromNum2 = num2.pop(); sum.push((elementFromNum1 + elementFromNum2 + carry) % 10); carry = (elementFromNum1 + elementFromNum2 + carry) / 10; } while (!num1.isEmpty()){ int element = num1.pop(); sum.push((element + carry) % 10); carry = (element + carry) / 10; } while (!num2.isEmpty()){ int element = num2.pop(); sum.push((element + carry) % 10); carry = (element + carry) / 10; } if (carry == 1){ sum.push(carry); } ListNode dummyNode = new ListNode(-1); ListNode rearNode = dummyNode; while (!sum.isEmpty()){ ListNode newNode = new ListNode(sum.pop()); rearNode.next = newNode; rearNode = rearNode.next; } return dummyNode.next; } Stack<Integer> linkToStack(ListNode head){ Stack<Integer> stack = new Stack<>(); while (head != null){ stack.push(head.value); head = head.next; } return stack; } public static void main(String[] args) throws IOException { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); bufferedReader.readLine(); String[] arrayInputs1 = bufferedReader.readLine().split(" "); String[] arrayInputs2 = bufferedReader.readLine().split(" "); int[] sum1 = new int[arrayInputs1.length]; for (int i = 0; i < arrayInputs1.length; ++i){ sum1[i] = Integer.valueOf(arrayInputs1[i]); } int[] sum2 = new int[arrayInputs2.length]; for(int i = 0; i < arrayInputs2.length; ++i){ sum2[i] = Integer.valueOf(arrayInputs2[i]); } ListNode.printLink(new Main().addLists(ListNode.convertArrayToLink(sum1), ListNode.convertArrayToLink(sum2))); } }