Code Ganker: Merge Two Sorted Lists -- LeetCode

2014年2月21日星期五

Merge Two Sorted Lists -- LeetCode

原题链接: http://oj.leetcode.com/problems/merge-two-sorted-lists/
这道题目比较简单,经典的链表基本操作。维护两个指针对应两个链表,因为一般会以一条链表为基准,比如说l1, 那么如果l1当期那的元素比较小,那么直接移动l1即可,否则将l2当前的元素插入到l1当前元素的前面。算法时间复杂度是O(m+n),m和n分别是两条链表的长度,空间复杂度是O(1),代码如下:
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
    ListNode helper = new ListNode(0);
    ListNode pre = helper;
    helper.next = l1;
    while(l1!=null && l2 != null)
    {
        if(l1.val>l2.val)
        {
            ListNode next = l2.next;
            l2.next = pre.next;
            pre.next = l2;
            l2 = next;
        }
        else
        {
            l1 = l1.next;
        }
        pre = pre.next;

    }
    if(l2!=null)
    {
        pre.next = l2;
    }
    return helper.next;
}
这个题类似的有Merge Sorted Array,只是后者是对数组进行合并操作,面试中可能会一起问到。扩展题目Merge k Sorted Lists, 这是一个在分布式系统中比较有用的基本操作,还是需要重视,面试中可以发散出很多问题。

2 条评论:

  1. 有点不明白,一直用的pre进行存储,为什么要用helper?为什么一开始要用helper.next = -1? 为什么没有了if(l1!=null)?

    回复删除
    回复
    1. 一般来说,如果链表头可能被改动,就会引入这个辅助链表指针,这样是避免当要插入链表头的时候不用分情况判断,就是表头永远都用helper来做,插入表头也只是放在helper后面。
      至于后面为什么没有if(l1!=null)的原因是我们一直都是插在l1里面的,如果l1这时候不是空也没关系,因为后面就是那些剩下的元素了,本来就接好了,只有当l2不是空的时候需要把它接到l1的尾部。

      删除