标签:info first 参考 ber ima png return 指针 style
题目如下:
给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807
思路分析:
因为需要遍历每个链表节点的值,既然是遍历,我们肯定需要用到循环,然而我们并不知道链表的长度,所以我们用while循环来进行迭代,我们需要用到一个末端哨兵的概念,当链表接触到最后一个节点时,循环停止
我自己写的代码如下
public ListNode addTwoNumbers(ListNode l1, ListNode l2) { //因为考虑到有进位的情况,所以在循环外设置一个标志变量 boolean flag=false; //起始链表,另外设置一个指针用于返回链表的头部 ListNode listNode =new ListNode(0); ListNode first =listNode; while(l1!=null&&l2!=null){ listNode.val=l1.val+l2.val; if(flag){ flag=false; listNode.val++; } if(listNode.val>=10){ listNode.val-=10; flag=true; } if(l1.next!=null||l2.next!=null){ listNode.next=new ListNode(0); listNode=listNode.next; } l1=l1.next; l2=l2.next; } while(l1!=null){ listNode.val=l1.val; if(flag){ flag=false; listNode.val++; } if(listNode.val>=10){ listNode.val-=10; flag=true; } if(l1.next!=null){ listNode.next=new ListNode(0); listNode=listNode.next; } l1=l1.next; } while(l2!=null){ listNode.val=l2.val; if(flag){ flag=false; listNode.val++; } if(listNode.val>=10){ listNode.val-=10; flag=true; } if(l2.next!=null){ listNode.next=new ListNode(0); listNode=listNode.next; } l2=l2.next; } //迭代完成后,判断是否还有进位 if(flag){ listNode.next=new ListNode(1); listNode=listNode.next; } return first; }
提交以后看了一下参考代码,发现在简洁度和细节方面还是可以提高
参考代码:
public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode dummyHead = new ListNode(0); ListNode p = l1, q = l2, curr = dummyHead; int carry = 0; while (p != null || q != null) { int x = (p != null) ? p.val : 0; int y = (q != null) ? q.val : 0; int sum = carry + x + y; carry = sum / 10; curr.next = new ListNode(sum % 10); curr = curr.next; if (p != null) p = p.next; if (q != null) q = q.next; } if (carry > 0) { curr.next = new ListNode(carry); } return dummyHead.next; }
标签:info first 参考 ber ima png return 指针 style
原文地址:https://www.cnblogs.com/pszp/p/9866114.html