zoukankan      html  css  js  c++  java
  • 关于leetcode中链表中两数据相加的程序说明

    * Definition for singly-linked list.  
     * struct ListNode {  
     *     int val;  
     *     struct ListNode *next;  
     * };  
     */  
       
    typedef struct ListNodep {  
         int val;  
         struct ListNodep *next;  
     }ListNode;  
       
       
    ListNode* addTwoNumbers(ListNode* I1, ListNode* I2) {  
        ListNode *rootp = NULL;  
        ListNode *listp = NULL;  
        int value = 0;  
        int varin = 0;  
          
        if(I1 == NULL && I2 == NULL) return rootp;  
          
        listp = (ListNode *)malloc(sizeof(ListNode));  
        rootp = listp;  
        listp->val = 0;  
        listp->next = NULL;  
          
        while(I1 != NULL || I2 != NULL || varin!= 0){  
              
            if(I1 == NULL && I2 != NULL)  value = I2->val + varin;  
              
            if(I1 != NULL && I2 == NULL)  value = I1->val + varin;  
              
            if(I2 != NULL && I1 != NULL)  value = I1->val + I2->val + varin;  
              
            if(I1 == NULL && I2 == NULL)  value = varin;  
                      
            varin = 0;  
              
            if(value >= 10){  
                varin = value /10;  
                value = value %10;  
            }  
      
            //此处需要注意,此处需要注意当当前链表已经为NULL后,他指向的空链表  
            //不能够在往下操作了,需要直接在给当前指针为空链表  
            if(I1 == NULL) I1 = NULL;  
            else I1 = I1->next;  
              
            if(I2 == NULL) I2 = NULL;  
            else I2 = I2->next;  
              
              
            listp->val = value;  
              
            if(I1 != NULL || I2 != NULL || varin != 0){  
                listp->next = (ListNode *)malloc(sizeof(ListNode));  
                listp = listp->next;}  
            else  
            {  
                listp->next = NULL;  
            }  
        }  
          
        return rootp;  
    }  
    

      

    leetcode问题描述 : 

    You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

    Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
    Output: 7 -> 0 -> 8

    //--------------------------------------------------------------------------------------------------------------------------------------------------------------------

    这里的两个链表数据相加问题可不是那么简单,主要有一下几种情况

    1、如果两个链表长度是一样的,就将链表中的元素相加输出即可

    2、如果两个链表的长度不是一样的,就要短链表位的补齐,如果不是使用补齐的方法,就需要考虑在逻辑上消除这种现象

    3、如果两个链表长度一样长,但是在最后一个元素相加出现了进位,那么就需要在最后一个链表上在添加一个链表,

    所以其实这个问题还是蛮复杂的

    下面是在c中运行时的代码 : 

    // list.cpp : 定义控制台应用程序的入口点。  
    //  
    #include "stdafx.h"  
    #include "stdio.h"  
    #include "stdlib.h"  
    #define ListDeep 1  
    typedef struct NODE{  
    NODE *P;  
    int data;  
    }ListTypr;  
    ListTypr list1[ListDeep];  
    ListTypr list2[ListDeep];  
    //---------------------------------------------------------------  
    void initlist(ListTypr *I1 , ListTypr *I2 , int listdeep){  
    for(short i = 0; i < listdeep ; i++){  
    I1->data=5;  
    if(i == listdeep-1) I1->P= NULL;  
    else I1->P= I1+1;  
    I1 = I1->P;  
    }  
    for(short i = 0; i < listdeep ; i++){  
    I2->data=5;  
    if(i == listdeep-1) I2->P= NULL;  
    else I2->P= I2+1;  
    I2 = I2->P;  
    }  
    }  
    ListTypr* addTwoNumbers(ListTypr* l1, ListTypr* l2) {  
    ListTypr *rootp = NULL;  
    ListTypr *listp = NULL;  
    int value = 0;  
    int varin = 0;  
    if(l1 == NULL && l2 == NULL) return rootp;  
    listp = (ListTypr *)malloc(sizeof(ListTypr));  
    listp->data = 0;  
    listp->P = NULL;  
    rootp = listp;  
    while(l1 != NULL || l2 != NULL || varin != 0){  
    if(l1 != NULL && l2 == NULL) value = l1->data + varin;  
    if(l1 == NULL && l2 != NULL) value = l2->data + varin;  
    if(l1 != NULL && l2 != NULL) value = l1->data + l2->data + varin;  
    if(l1 == NULL && l2 == NULL) {  
    value = varin;  
    varin = 0;  
    }  
    if(value >= 10){  
    varin = value / 10;  
    value = value % 10;  
    }  
    if(l1 == NULL) l1 = NULL;  
    else l1 = l1->P;  
    if(l2 == NULL) l2 = NULL;  
    else l2 = l2->P;  
    listp->data = value;  
    if(l1 != NULL || l2 != NULL || varin != 0){  
    listp->P = (ListTypr *)malloc(sizeof(ListTypr));  
    listp = listp->P;}  
    else{  
    listp->P = NULL;  
    }  
    }  
    return rootp;  
    }  
    int _tmain(int argc, _TCHAR* argv[])  
    {  
    short listdeep = ListDeep;  
    ListTypr * plistresult = NULL;  
    ListTypr * rep = NULL;  
    int resultmatrix[10];  
    short i = 0;  
    initlist(&list1[0] , &list2[0] , listdeep);  
    plistresult = addTwoNumbers(&list1[0] , &list2[0]);  
    while(plistresult != NULL){  
    resultmatrix[i] = plistresult->data;  
    plistresult = plistresult->P;  
    i = i + 1;  
    }  
    while(1);  
    return 0;  
    }  
  • 相关阅读:
    读书笔记Review: HTTP and HttpServletRequest
    读书笔记JavaScript Patterns_chapter6_Code Reuse Patterns
    读书笔记Review: servlet lifecycle and API
    读书笔记Review: HttpServletResponse
    简单分析Ext.ComponentMgr 函数
    翻译 Extjs in action中的Event flow in the DOM
    struts中的web.xml
    读书笔记_Extjs In Action_The Component Life Cycle
    web service中的事件
    Remoting学习笔记
  • 原文地址:https://www.cnblogs.com/havihouston/p/6183668.html
Copyright © 2011-2022 走看看