首页 > 试题广场 >

两个链表生成相加链表

[编程题]两个链表生成相加链表
  • 热度指数:2045 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。
给定两个这种链表,请生成代表两个整数相加值的结果链表。
例如:链表 1 为 9->3->7,链表 2 为 6->3,最后生成新的结果链表为 1->0->0->0。

输入描述:
第一行两个整数 n 和 m,分别表示两个链表的长度。

第二行 n 个整数 ai 表示第一个链表的节点。

第三行 m 个整数 bi 表示第二个链表的节点。


输出描述:
输出一行整数表示结果链表。
示例1

输入

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;
    }
}

发表于 2021-06-01 22:20:56 回复(0)
# 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;
}

发表于 2020-06-12 10:28:31 回复(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);
    
}

发表于 2022-05-23 18:02:22 回复(0)
时间复杂度O(n+m),空间复杂度O(1)
1 先反转链表
2 计算结果链表
3 反转结果链表
4 输出
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;
    }
}


发表于 2021-08-10 17:21:36 回复(0)

直接套用高精度加法模板

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;
    }
}
发表于 2020-07-02 10:40:45 回复(0)
代码运行了好几遍终于通过了。。。。。。。。。。
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()+" ");
        }
        
    }
}


发表于 2020-04-15 00:03:25 回复(0)
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;
		}
	}
}

发表于 2020-01-08 17:19:19 回复(1)
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);
    }
}

不通过
您的代码已保存
运行超时:您的程序未能在规定时间内运行结束,请检查是否循环有错或算法复杂度过大。
case通过率为75.00%
发表于 2020-01-01 10:32:30 回复(0)
n, m = map(int, input().split())
a = int(''.join(input().split()))
b = int(''.join(input().split()))
c = a+b
print(' '.join(str(c)))
通过率40%,然而结果无误,什么原因
发表于 2019-11-16 10:41:57 回复(1)
新增的代码如下,新增一个翻转链表函数
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;
}


发表于 2019-09-14 20:37:48 回复(0)
C/C++
100%通过
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-----
}


发表于 2019-09-13 11:04:17 回复(1)

时间复杂度太大,只能通过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)));
    }
}
编辑于 2019-09-13 02:46:28 回复(0)

问题信息

上传者:小小
难度:
12条回答 3775浏览

热门推荐

通过挑战的用户

查看代码