zoukankan      html  css  js  c++  java
  • careercup-链表 2.5

    2.5 给定两个用链表表示的整数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表首部。编写函数对这两个整数求和,并用链表形式返回结果。

    示例:

    输入: (7->1->6)+(5->9->2),即617+295.

    输出:2->1->9,即912.

    进阶:

    假设这些数位是正向存放的

    示例:

    输入:(6->1->7)+(2->9->5),即617+295.

    输出:9->1->2,即912.

    逆向存放时,C++实现:

    #include<iostream>
    #include<new>
    using namespace std;
    
    struct ListNode
    {
        int val;
        ListNode *next;
        ListNode(int x):val(x),next(NULL) {}
    };
    
    void createList(ListNode *&L,int arr[],int n)
    {
        int i;
        ListNode *p=NULL;
        for(i=0; i<n; i++)
        {
            ListNode *tmp=new ListNode(arr[i]);
            if(L==NULL)
            {
                L=tmp;
                p=tmp;
            }
            else
            {
                p->next=tmp;
                p=tmp;
            }
        }
    }
    
    ListNode *merge(ListNode *L1,ListNode *L2)
    {
        if(L1==NULL&&L2==NULL)
            return NULL;
        if(L1==NULL||L2==NULL)
            return L1!=NULL?L1:L2;
        ListNode *p=L1;
        ListNode *pre=L1;
        ListNode *q=L2;
        int carry=0;
        while(p&&q)
        {
            int sum=p->val+q->val+carry;
            p->val=sum%10;
            carry=sum/10;
            pre=p;
            p=p->next;
            q=q->next;
        }
        while(p)
        {
            int sum=p->val+carry;
            cout<<sum<<endl;
            p->val=sum%10;
            carry=sum/10;
            pre=p;
            p=p->next;
        }
        ListNode *tmp=NULL;
        while(q)
        {
            int sum=q->val+carry;
            tmp=new ListNode(sum%10);
            carry=sum/10;
            pre->next=tmp;
            pre=tmp;
            q=q->next;
        }
        if(carry==1)
        {
            tmp=new ListNode(carry);
            pre->next=tmp;
        }
        return L1;
    }
    
    int main()
    {
        ListNode *L1=NULL;
        ListNode *L2=NULL;
        int arr1[3]={7,1,9};
        int arr2[5]={5,9};
        createList(L1,arr1,3);
        createList(L2,arr2,2);
        ListNode *head=merge(L1,L2);
        ListNode *p=head;
        while(p)
        {
            cout<<p->val<<" ";
            p=p->next;
        }
        cout<<endl;
    }

    正向存放时,可以先利用头插入将两个链表逆转,然后按照上面的过程求和。

  • 相关阅读:
    不容易系列之(4)——考新郎
    阿牛的EOF牛肉串
    一只小蜜蜂
    C#设计模式——简单工厂模式
    C#设计模式总结
    [设计模式]单例模式
    Jquery真的不难~第一回 编程基础知识
    大树底下不长草,微软底下?
    下一站 java
    如果电磁不能永久保存,那最终会留下什么?
  • 原文地址:https://www.cnblogs.com/wuchanming/p/4141562.html
Copyright © 2011-2022 走看看