https://leetcode.com/problems/add-two-numbers/description/
* stoi 주의점
21억( 2,147,483,647 )== 문자열로 10자리만 벗어나도 out of range 가뜸
-> stoll을 사용할것 ( 9,223,372,036,854,775,807)
-한계 : 20자리이상은 불가능함.
-> 숫자계산으로 구현해야함. 문자열꼼수 안통해
* 기존코드
숫자를 문자열로 바꾸면서 덧셈하고
해당 숫자를 다시 노드로 바꿈
- 문제 : stoi 에서 stoll로 해도 ll의 범위도 벗어나버림
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
string s1="";
auto cur = l1;
while(cur){
s1+=to_string(cur->val);
cur=cur->next;
}
//cout<<s1;
string s2="";
cur = l2;
while(cur){
s2+=to_string(cur->val);
cur=cur->next;
}
//cout<<s2;
reverse(s1.begin(),s1.end());
reverse(s2.begin(),s2.end());
long long a = stoll(s1)+stoll(s2); //stoi : out of range!
//int a =99;
//cout<<a;
string s=to_string(a); //807
reverse(s.begin(),s.end()); //708
ListNode* ret = new ListNode();
ListNode* ptr=ret; //첫주소 저장
for(int i=0;i<s.size();++i){
//ret->val=s[i]-'0';
// temp=new ListNode(s[i]-'0');
// cout<<temp->val<<"\n";
// temp=temp->next;
ptr->next = new ListNode(s[i]-'0');
ptr=ptr->next;
}
return ret->next;
}
};
* 개선의사코드
* 전체코드
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* result = new ListNode(); //begin
ListNode* ptr = result; //iterator
int carry=0;
while(l1 || l2){
int sum=0+carry; //합 = 이전캐리반영
if(l1){
sum+=l1->val;
l1=l1->next;
}
if(l2){
sum+=l2->val;
l2=l2->next;
}
carry=sum/10; //9+9 =18의 1을넘김
sum=sum%10;
ptr->next = new ListNode(sum);
ptr=ptr->next;
}
if(carry==1) ptr->next = new ListNode(1); //캐리가 남은경우
return result->next;
}
};
*노드 begin 저장방법
ptr만 ptr=ptr->next로 조정하면됨.
ListNode* result = new ListNode(); //begin
ListNode* ptr = result; //iterator
'Algorithm > 연결리스트' 카테고리의 다른 글
[알고리즘] 리트코드 19. 리스트 끝에서 N번째 노드 제거 c++ // 노드탐색 (0) | 2024.07.02 |
---|---|
프로그래머스 표편집 c++ // 연결리스트 직접구현 하는방법, 삽입삭제 되돌리기는 연결리스트(직접구현)! (0) | 2023.11.23 |
백준 1158 cpp // 연결리스트 풀이, int_to_string(int), List.erase() 주의사항 (0) | 2023.08.16 |
백준 5397 cpp// 연결리스트 메모장 (0) | 2023.08.14 |
백준 1406 cpp // 연결리스트 사용법 (0) | 2023.08.14 |