LeetCode Q2

来源:互联网 发布:网络监听技术 编辑:程序博客网 时间:2024/05/01 07:46

今天手痒痒,又找时间趁热打铁写了第二个问题的算法。

第二个问题的题目是将两个非负整数用链表表示,然后对其进行求和,原题如下:

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

分析后发现这个题目很简单,重点在链表的创建和指针的操作上,我相信学过数据结构的人都会很熟练地完成,注意进位即可,不过一定要注意的一点是,链表默认头指针不包含数据,访问时使用结点对应指针访问数据(我原先的习惯是用当前结点的前驱结点指针来访问当前结点元素,为的就是可以保留前驱结点指针以备访问,不用再循环或新建),而LeetCode默认的测试程序可能传入和需要返回的是直接指向包含数据的结点的指针,因此我调试了好几遍都报wrong answer的错误。最后通过的代码如下:
#include "stdafx.h"#include <iostream>#include <string>using namespace std;struct ListNode {      int val;      ListNode *next;      ListNode(int x) : val(x), next(NULL) {}};ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {ListNode* l = (ListNode*)malloc(sizeof(ListNode));l->next = NULL;ListNode* p = l;ListNode* p1 = l1;ListNode* p2 = l2;int flag = 0;//标记是否进位for(;p1!=NULL || p2!=NULL;){ListNode* node = (ListNode*)malloc(sizeof(ListNode));if(p1!=NULL && p2!=NULL){if(p1->val + p2->val + flag >= 10){node->val = (p1->val + p2->val + flag ) % 10;node->next = NULL;p->next = node;p = p->next;flag = 1;}else {node->val = (p1->val + p2->val + flag );node->next = NULL;p->next = node;p = p->next;flag = 0;}p1 = p1->next;p2 = p2->next;}else if(p2 == NULL){if(p1->val + flag >= 10){node->val = (p1->val + flag ) % 10;node->next = NULL;p->next = node;p = p->next;flag = 1;}else {node->val = (p1->val + flag );node->next = NULL;p->next = node;p = p->next;flag = 0;}p1 = p1->next;}else {if(p2->val + flag >= 10){node->val = (p2->val + flag ) % 10;node->next = NULL;p->next = node;p = p->next;flag = 1;}else {node->val = (p2->val + flag );node->next = NULL;p->next = node;p = p->next;flag = 0;}p2 = p2->next;}}if(flag == 1){ListNode* node = (ListNode*)malloc(sizeof(ListNode));node->val = flag;node->next = NULL;p->next = node;p = p->next;flag = 0;}return l->next;}int _tmain(int argc, _TCHAR* argv[]){ListNode* l1 = (ListNode*)malloc(sizeof(ListNode));//给链表结点开辟空间并初始化,malloc和->next = NULL是链表必备初始化项目ListNode* l2 = (ListNode*)malloc(sizeof(ListNode));l1->next = NULL;l2->next = NULL;int num1=5,num2=5;/*cout<<"please input two non-negative numbers:"<<endl;cin>>num1;cin>>num2;*/if(num1<0 || num2<0){cout<<"sorry! you input the wrong numbers!"<<endl;return -1;}ListNode* p = l1;if(num1==0){ListNode* node = (ListNode*)malloc(sizeof(ListNode));node->val = 0;node->next = NULL;p->next = node;p = p->next;}else{for(;num1 != 0;num1 = (num1 - p->val)/10){ListNode* node = (ListNode*)malloc(sizeof(ListNode));node->val = num1 % 10;node->next = NULL;p->next = node;p = p->next;}}p = l2;if(num2==0){ListNode* node = (ListNode*)malloc(sizeof(ListNode));node->val = 0;node->next = NULL;p->next = node;p = p->next;}else{for(;num2 != 0;num2 = (num2 - p->val)/10){ListNode* node = (ListNode*)malloc(sizeof(ListNode));node->val = num2 % 10;node->next = NULL;p->next = node;p = p->next;}}ListNode* result = addTwoNumbers(l1->next,l2->next);while(result!=NULL){cout<<result->val;result = result->next;if(result!=NULL)cout<<"->";}cout<<endl;return 0;}

总结:

1.数据结构的知识不能忘,要保证任何时候想写就能写,而且不能错

2.LeetCode不把测试程序展示出来,传参经常会出错,我忍不住要吐槽一下。。。

刷完第二题,再给自己加加油!

0 0