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; //       
}

좋은 웹페이지 즐겨찾기