Algorithm week 1: Merge Two Sorted Lists
基础题,合并两个有序链表。
思路很简单,用两个指针分别指向两条链表当前的未合并结点,总是取较小值加入结果串。
过程中需要注意边界情况处理:链表为空,链表只包含一个结点,链表遍历到尾部,返回指针应该指向结果串的头部。
但是其实前面给结果串赋头结点的情况处理得有点复杂了,如果利用哨兵(给ret单独的头结点)可以再简化一下编程。链表遍历完的情况也可以统一挪出来单独处理,l1和l2也不需要保留原样(对于做题来说)。
简化完会有一个赏心悦目的版本:
当然还存在最简洁的递归写法,代价是由于需要m+n次压栈,空间复杂度由O(1)升为O(M+N)。对于小规模数据来说完全没有问题。
写链表的时候需要额外留意边界条件处理
如果链表为空时,代码是否能正常工作?
如果链表只包含一个结点时,代码是否能正常工作?
如果链表只包含两个结点时,代码是否能正常工作?
代码逻辑在处理头结点和尾结点的时候,是否能正常工作?
哨兵结点的加入(单独的头、尾结点,拒绝插入空链表/删一个结点的链表等special case)也可以有效简化编程。
版权声明: 本文为 InfoQ 作者【猫吃小怪兽】的原创文章。
原文链接:【http://xie.infoq.cn/article/d471398492df328cf7690fb12】。文章转载请联系作者。
评论