Add Two Numbers

来源:互联网 发布:手机网络初始化失败 编辑:程序博客网 时间:2024/06/06 02:32

经典的单链表问题,涉及到的内容是单链表的遍立和添加
首先需要声明一点,题目中的两个链表长度并不一定相等。想到的方法是通过第三方给ListNode赋值,用局部变量记录两个链表的和差,代码如下:

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
boolean flag = true;

    ListNode pNew;    ListNode tail = new ListNode(0);    ListNode returnNode = tail;    int sum,up=0;    while(l1 != null || l2 != null){        sum = up;        if(l1 != null){            sum += l1.val;            l1 = l1.next;        }        if(l2 != null){            sum += l2.val;            l2 = l2.next;        }        if(flag){            tail.val = sum%10;            flag = false;        }else {            pNew = new ListNode(sum%10);            tail.next = pNew;            tail = pNew;        }        up = sum/10;                }    if(up>0){        pNew = new ListNode(up);        tail.next = pNew;    }    return returnNode;}

花费时间:51ms
很久不用链表了,所以写的时候竟然有些无措,看了一些单链表添加的文章,针对此处有些理解困难:
链表本体是returnNode;链表尾部节点tail;每一个新的节点pNew;
首先新建一个节点pNew,然后将tail的地址指向pNew,再将returnNode的地址指向tail;
之后在建立新的pNew节点,将tail的next指向pNew,此处将tail和pNew连接起来,而returnNode因为指向tail所以不需要重新赋值,这一步的目的是在给returnNode增加节点。
而之后讲尾节点tail重新赋值pNew,是将pNew的当前指向传递给tail,在通过下一次的next指向pNew将tail和pNew连接起来,通过tail和pNew的不断链接,单链表越来愈长,而此时returnNode指向的仍然是最初创建的pNew。
我采用的是尾插法生成链表
r->next=p;//循环内部只是让最后一个结点指针指向连新创建的结点
r=p;//每次让指针r始终跟踪当前链表中的最后一个结点
而头插法需要:
p->next=r->next;//每次让让新结点的指针指向原来结点指针指向的结点
r->next=p;//将原来结点指针指向为新结点
就理解来说头插法更复杂一些。
单链表最大的问题在于不能很方便的遍历,也不能通过position获取某固定节点。遍历只能通过while来进行,而其松散结构更利于从指定位置移除和加入值

找了一个实现思路差不多的C++版本:http://blog.csdn.net/zkj126521/article/details/72674953?locationNum=1&fps=1
用时52ms

目前还没找到新的思路,如果你有请@我,3q

原创粉丝点击