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; }
正向存放时,可以先利用头插入将两个链表逆转,然后按照上面的过程求和。
时间: 2024-10-10 07:54:45