程序员面试金典 02.05 链表求和
我的想法和答案是一样的但是代码写得很烂,只过了1100多个例子,改来改去都不过,确实是设计思路没人家清晰
int result;
if(l1&&l2)
{
result=l1->val+l2->val;
return result;}
if(l1)
{
result=l1->val;
}
if(l2)
{
result=l2->val;
}
return result;
}
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode*head=new ListNode(0);
ListNode*tmp=head;
int nextnum=0;
while(l1||l2)
{
if(addtwo(l1,l2)+nextnum<10)
{
if(!head->next)
{head->next=new ListNode(0);}
head->next->val+=addtwo(l1,l2);
head=head->next;
}
if(addtwo(l1,l2)+nextnum>=10)
{
if(!head->next)
{head->next=new ListNode(0);nextnum=0;}
if(nextnum==1)
{
head->next->val=(addtwo(l1,l2)+nextnum)%10;
}
else
{
head->next->val+=(addtwo(l1,l2)+nextnum)%10;
}
head->next->next=new ListNode(1);
nextnum=1;
head=head->next;
}
if(l1)
{l1=l1->next;}
if(l2)
{l2=l2->next;}
}
return tmp->next;
}
原来写的太绕了把自己绕进去了,对比答案,答案用双指针,head接收第一个元素,tail接收第一个之后的元素,点睛之笔在用carry接收进位的数,两个链表循环后如果carry>0还新增一个节点
获取链表数的方法很适用于不等长链表
很重要的一点是怎么分类,我按照是否有进位来分类,不如答案的用一条式子解决两种情况
程序员面试金典 02.06 回文链表
之前有做过回文字符串,用哈希表做的,那题是用奇偶数来判断的,哈希表记录字符数量,遍历哈希表若字符奇数数量大于1则不是回文;这题没有说明数据的区间不好用哈希表做
当操作的是链表的时候,不提供随机访问迭代器,可以有两种思路把链表转化为数组,变成操作数组和反转链表
反转链表:用快慢指针让指针指向链表中间,然后执行反转操作,再同时遍历比较是否相同,两种做法本质上是一样的