leetCode 연습 문제 - C 는 두 수 를 더 합 니 다 (한 번 순환)
문 제 · 요구 사항
주의 점
사고방식
코드
QQ:3020889729 제목 · 요구
비 어 있 는 링크 두 개 를 제시 하여 두 개의 비 마이너스 정 수 를 나타 낸다.그 중에서 이들 각자 의 자릿수 는 역순 으로 저장 되 고 그들의 각 노드 는 한 개의 숫자 만 저장 할 수 있다.
만약 우리 가 이 두 개의 수 를 더 하면 새로운 링크 로 돌아 가 그들의 합 을 나 타 낼 것 이다.
숫자 0 을 제외 하고 이 두 숫자 는 0 으로 시작 하지 않 을 것 이 라 고 가정 할 수 있 습 니 다.
예시:
입력: (2 - > 4 - > 3) + (5 - > 6 - > 4) 출력: 7 - > 0 - > 8 원인: 342 + 465 = 807
주의 점
이 문 제 를 풀 때 링크 의 공간 과 다음 노드 가 메시지 (NULL 이 아 닌) 를 찾 을 수 있 는 지 주의해 야 합 니 다.
4. 567917. 새 링크 를 만 들 때 메모리 공간 을 열 어 주 는 것 을 기억 해 야 합 니 다
4. 567917. 중간 링크 를 만 들 때 next = NULL (비어 있 을 때) 을 제때에 설정 해 야 합 니 다
사고의 방향
4. 567917. 두 개의 링크 를 교체 하고 진 위 를 고려 한 다음 에 중간 링크 (새로 만 든 결과 링크) 에 전달 합 니 다
4. 567917. 반복 적 으로 화 해 를 구 할 때 두 개의 링크 의 길이 가 일치 하 는 지 주의해 야 한다. 즉, 두 자릿수 + 3 자릿수 의 상황 이 발생 할 수 있 기 때문에 노드 수 치 를 더 할 때 두 노드 가 동시에 비어 있 는 지 판단 해 야 한다.
4. 567917. 동시에 비어 있 지 않 으 면 그 중의 한 노드 를 메모리 로 분배 하고 값 을 0 에 부여 하여 링크 의 길이 가 같 고 위치 에 따라 대응 하 는 결 과 를 계산 합 니 다
4. 567917. 모든 입력 을 계산 한 후에 우 리 는 결 과 를 고려 해 야 한다. 예 를 들 어 가장 큰 노드 가 있 으 면 우 리 는 돌아 가기 전에 next 를 NULL 로 설정 하여 링크 조회 가 틀 리 지 않도록 해 야 한다.
4. 567917. 결 과 를 수정 할 때 현재 결과 의 가장 큰 노드 가 진 위 를 가지 고 있 는 지 주의해 야 한다. 진 위 를 가지 고 있 으 면 먼저 정확 한 마지막 노드 로 이동 한 다음 에 next 를 NULL 로 설정 해 야 한다
구체 적 으로 코드 의 주석 을 참고 할 수 있 습 니 다. ※ 주석 은 쌍 을 이 루어 나타 납 니 다. ※ - ※ 코드 는 관련 이 있 습 니 다.
코드
/*
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
struct ListNode* temp1 = (struct ListNode*)malloc(sizeof(struct ListNode)); //
struct ListNode* start = temp1; // ,
temp1->next = NULL; // next NULL,
temp1->val = 0;
while(l1!=NULL || l2!=NULL) // ※ , 73,111, :073,111—— NULL ,
{
temp1->val += l1->val + l2->val; //
if(temp1->val>=10) // 10,
{
temp1->val = temp1->val - 10;
temp1->next = (struct ListNode*)malloc(sizeof(struct ListNode)); //
temp1->next->val = 1; // :10~19—— 1 1
}
else
{
temp1->val = temp1->val;
temp1->next = (struct ListNode*)malloc(sizeof(struct ListNode));//
temp1->next->val = 0; // , 0
}
l1 = l1->next; //
l2 = l2->next;
if(l1!=NULL || l2!=NULL) // —— , , , val 0—— 73-073
{
if(l1==NULL) // l1 , 0
{
l1 = (struct ListNode*)malloc(sizeof(struct ListNode));
l1->next = NULL;
l1->val = 0;
}
if(l2==NULL)
{
l2 = (struct ListNode*)malloc(sizeof(struct ListNode));
l2->next = NULL;
l2->val = 0;
}
temp1 = temp1->next; // ,
}
if(l1 == NULL && l2 == NULL) // ※ —— 。 ,
{
// , ,
// ①: , 9 , temp1 , next NULL
// ②: , 10 , temp1 , , , next NULL
if(temp1->next->val != 0) // ,
{
temp1 = temp1->next;
temp1->next = NULL;
}
else // , next NULL
{
temp1->next = NULL;
}
}
}
return start; //
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
에세이 - 두 개의 순차적 단일 체인 테이블 결합(반복/비반복)제목: 두 개의 질서정연한 단일 체인 테이블 병합 반복: 비반복:...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.