규방 의 외 사슬 표 와 사랑 을 기다리다.
원제: 두 개의 단일 체인 시트 (singly linked list), 각 노드 에 0 - 9 의 숫자 를 입력 하면 두 개의 대수 에 해당 합 니 다.그리고 이 두 수의 합 (새 list) 을 되 돌려 줍 니 다.이 두 입력 의 list 길 이 는 같다.요 구 는: 귀속 할 필요 가 없다.요구 알고리즘 은 가장 좋 은 상황 에서 두 개의 list 를 한 번 만 옮 겨 다 니 고 최 악의 경우 두 번 만 옮 겨 다 니 도록 합 니 다.
분석: 만약 에 링크 가 나타 내 는 수량 이 낮은 것 에서 높 은 위치 로 표시 된다 면 매우 간단 하 다.높 은 곳 에서 낮은 곳 까지 라면 문제 가 복잡 하고, 진 위 는 모든 악의 근원 이다.
두 개의 단일 체인 표 는 각 노드 에 0 - 9 의 숫자 를 저장 하면 하나의 단일 체인 표 는 하나의 큰 수 를 나타 낸다.높 은 위치 에서 낮은 위치 로 저장 하 는 것, 즉 표 두 가 대응 하 는 것 은 이 대수 의 가장 높 은 위치 이다.두 개의 링크 의 길이 가 같 습 니 다. 우 리 는 새로운 단일 링크 를 되 돌려 야 합 니 다. 이 두 개의 입력 링크 가 대표 하 는 수의 합 입 니 다.우 리 는 재 귀 를 사용 할 수 없고 추가 저장 공간 을 사용 할 수 없다. 즉, 공간 복잡 도 는 O (1) 이다.링크 를 한 번 만 옮 겨 다 니 며 출력 링크 도 단일 링크 입 니 다.두 개의 입력 링크 를 한 번 만 옮 겨 다 닐 수 있 으 니 높 은 자리 에서 시작 합 시다.이런 제한 조건 하에 서 이것 이 유일한 길이 다.그래서?진 위 는 어떻게 정 합 니까?먼저 높 은 자 리 를 올 리 고 낮은 자 리 를 더 하면 낮은 위치 에서 발생 하 는 진 위 는 어떻게 높 은 위치 로 올 립 니까?우리 앞 방향 지침 없어.앞 방향 지침 이 없 는 이상 우 리 는 임시 지침 으로 높 은 위 치 를 가리 키 게 하고 낮은 위치 에 진 위 를 더 할 때 우 리 는 높 은 위 치 를 조작 할 수 있다.그림 을 보 여 주세요.
1: 1 2 3 2: 1 2 8 : 2 4 : p q
출력 링크 의 현재 노드 를 가리 키 는 포인터 q 가 3 + 8 = 11 을 발견 하면 진 위 를 만 들 고 높 은 비트 를 가리 키 는 p 는 노드 값 을 1 로 추가 합 니 다.주의 하 세 요. 0 - 9 의 수 를 더 하면 들 어가 지 않 거나 1 로 들 어가 거나 두 가지 상황 만 있 습 니 다.따라서 우 리 는 진위 가 다른 수 라 는 점 을 고려 하지 않 아 도 된다 는 점 이 중요 하 다. 나중에 볼 수 있 을 것 이다.이렇게 하면 돼 요?물론 아니 야, 만약 네가 연속 진 위 를 만난다 면 어떻게 깨 뜨 릴 거 야?아래 의 상황 을 보십시오.
1: 1 2 3 4 5 2: 1 7 6 5 9
분명 한 것 은 높 은 위 치 를 가리 키 는 지침 p 는 항상 현재 결점 을 가리 키 는 지침 q 를 따라 가 서 는 안 된다. 그러면 연속 적 인 진 위 를 만 났 을 때 p 보다 높 은 위치 도 바 뀌 어야 한다.p 가 q 를 바짝 따라 갈 수 없 는 이상, 우 리 는 그것들 을 바짝 붙 이지 못 하 게 하고, 그것들 에 게 약간의 거 리 를 만들어 준다.어떤 상황 에서 연속 진 위 를 할 수 있 는 지 생각해 보 세 요.9! 응, 9 를 만 났 을 때.그것 은 어느 분 까지 연속 으로 들 어 가 려 고 합 니까?9 가 아 닌 그 분.따라서 포인터 p 는 9 가 아 닌 사람 에 게 머 물 러 그림 을 봐 야 한다.
1: 1 2 3 4 5 2: 1 7 6 5 9 : 2 9 9 9 : p q
이번 에는 q 가 진 위 를 해 야 한 다 는 것 을 발 견 했 을 때 p 가 가리 키 는 결점 에 1 을 더 한 다음 에 p, q 간 의 결점 을 모두 0 으로 놓 으 면 된다.왜 모두 0 을 두 었 을 까? 왜냐하면 진 위 는 1, 9 + 1 = 10 일 수 있 기 때문에 이 자리 에 남 은 것 은 당연히 0 이기 때문이다.분석 이 끝나 면 이런 방법 은 언제든지 링크 를 한 번 만 옮 겨 다 니 며 입력 해 야 한다. 공간 복잡 도 O (1).구체 적 인 코드 는 다음 과 같다.
#include<iostream>
#include<memory.h>
using namespace std;
struct Node
{
int val;
struct Node* next;
Node(int x):val(x),next(NULL){}
};
Node* AddLinkList(Node* head1,Node* head2)
{
if(head1 == NULL)return head2;
if(head2 == NULL)return head1;
Node* head = new Node(head1->val+head2->val);//
Node* p1 = head1->next,*p2 = head2->next,*p,*q = head,*pre=head;//q
while(p1 && p2)
{
int sum = p1->val+p2->val;
p = new Node(sum % 10);
pre->next = p;
pre = p;
if(sum > 9)
{
q->val += 1;
for(q=q->next;q!=p;q=q->next)q->val = 0;//p 1, 9 0
}
else if(sum < 9)q = p;// p
p1 = p1->next;
p2 = p2->next;
}
if(head->val > 9)
{
p = new Node(1);
p->next = head;
head->val -= 10;
head = p;
}
return head;
}
Node* MakeLinkedList(int* data,int n)
{
if(data == NULL || n<=0)return NULL;
Node* head = new Node(data[0]);
Node* pre = head,*p;
int i;
for(i = 1;i<n;i++)
{
p = new Node(data[i]);
pre->next = p;
pre = p;
}
return head;
}
void print(Node* head)
{
while(head)
{
cout << head->val << " ";
head = head->next;
}
cout<<endl;
}
void deleteNode(Node* &head)
{
if(head == NULL)return;
if(head->next)deleteNode(head->next);
delete head;
head = NULL;
}
int main()
{
int n,i;
Node* head1,*head2;
cout << "---------- ---------"<<endl;
while(cin >> n)
{
int* data = new int[n];
cout <<"------- ------"<<endl;
for(i=0;i<n;i++)cin >> data[i];
head1 = MakeLinkedList(data,n);
cout <<"------- -------------"<<endl;
print(head1);
cout <<"------- ------"<<endl;
for(i = 0;i<n;i++)cin >> data[i];
head2 = MakeLinkedList(data,n);
cout <<"------- -------------"<<endl;
Node* head = AddLinkList(head1,head2);
cout <<"------- -----------"<<endl;
print(head);
deleteNode(head1);
deleteNode(head2);
deleteNode(head);
cout << "---------- ---------"<<endl;
}
return 0;
}
잘못 이 있 으 면 지적 해 주 십시오. 감사합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.