程序分为两个部分:
1. 翻转链表
2. 进位相加
取值(由于当指针为空不允许value域作加减运算,且要依据空指针作为结束循环条件,所以这么用)
进位加法
赋值(分配链接新节点)
最麻烦的就是指针越界问题,希望随着经验增加,可以快速解决吧。
纠结变量用的有点多,C语言编写,寻求改进办法,请指教!
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* convertLinkList( struct ListNode *L){
//翻转链表
if ( L->next == NULL )
return L;
struct ListNode *pre, *cur, *next;
pre = L; cur = pre->next; next = cur->next;
pre->next = NULL;
while( cur !=NULL )
{
cur->next = pre;
pre = cur; cur = next;
if ( next != NULL )
next = next->next;
}
return pre;
}
/**
*
* @param head1 ListNode类
* @param head2 ListNode类
* @return ListNode类
*/
struct ListNode* addInList(struct ListNode* head1, struct ListNode* head2 ) {
// write code here
struct ListNode *p, *q;
struct ListNode *res;
struct ListNode *m,*n;
int value = 0;
int pre = 0;
int v1, v2;
p = convertLinkList(head1);
q = convertLinkList(head2);
//“1”分配一个头节点,如果不先分配,只是空指针在程序下面语句 “2”处,将报错无法执行
m = res = (struct ListNode *)malloc( sizeof( struct ListNode) );
m->next = NULL;
while ( p || q || pre == 1)
{
//
if( p != NULL )
{
v1 = p->val;
p = p->next;
}
else v1 = 0;
if( q != NULL )
{
v2 = q->val;
q = q->next;
}
else v2 = 0;
value = v1 +v2 + pre;
if ( value >= 10 )
{
pre = 1;
value = value % 10;
}
else pre = 0;
n = (struct ListNode *)malloc( sizeof( struct ListNode) );
n->val = value;
n->next = NULL;
m->next = n;//-------------------"2"
m = n;
}
//这里因为上面实现分配了一个空节点,所以避免返回空节点而返回第二个开始,并翻转一次,得到正确结果。
return convertLinkList(res->next);
}