题目:链表求和
示例:
输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),
即617 + 295 输出:2 -> 1 -> 9,即912
思路:此题主要考察对链表的操作,借助链表的形式完成两数求和。求解过程为,每次取两个链表的对应节点,求和之后将其放入新节点,并尾部插入到新链表,因为链表是反向存储,直到将两个链表求解结束,值得注意的是,两个数的长度不一定相同,所以在一个链表结束之后,还需判断另一个链表是否是有剩余节点。
参考:
/* * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ //定义全局变量p指向每次插入节点的前驱节点,方便在addItem函数中进行节点链接 struct ListNode *p = NULL; //完成每一项相加,并进行节点链接,进位sign采用地址传递,因为函数内部会修改进位并在下一次计算时进行使用 void addItem(int a, int b, int *sign) { struct ListNode *s = (struct ListNode*)malloc(sizeof(struct ListNode)); int tmp = a + b + *sign; if(tmp >= 10) { tmp -= 10; *sign = 1; } e lse *sign = 0; s->val = tmp; s->next = NULL; //链接节点 p->next = s; p = s; } s truct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) { struct ListNode *head = (struct ListNode *)malloc(sizeof(struct ListNode)); head->next = NULL; //全局变量初始化 p = head; int sign = 0; while(l1!=NULL && l2!=NULL) { addItem(l1->val, l2->val, &sign); l1 = l1->next; l2 = l2->next; } w hile(l1 != NULL) { addItem(l1->val, 0, &sign); l1 = l1->next; } w hile(l2 != NULL) { addItem(0, l2->val, &sign); l2 = l2->next; } if( sign != 0) addItem(0, 0, &sign); struct ListNode *tmp = head; head = head->next; free(tmp); return head;