Idiot-maker

  :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

https://oj.leetcode.com/problems/merge-two-sorted-lists/

Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.

解题思路:

这道题比较基础,和数组的归并排序类似。可以考虑一个全新的待构建的mergedList,首先初始化他的首节点为l1和l2中较小的那个。当然,这之前必须判断l1和l2的null情况,可直接return。然后l1和l2往后迭代,并将mergedList的next指向他们中间较小的节点,同时将mergedList往后移动一个,同时l1和l2中较小的那个节点也向后移动一个。如此往复,直到l1或l2有一个到达结尾。

最后,将l1和l2剩下的一段(即较长的),直接接在mergedList最后。返回mergedList,当然这里返回的是开始预留的指向首节点的引用,因为这时的节点已经指向结尾。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        if(l1 == null){
            return l2;
        }
        if(l2 == null){
            return l1;
        }
        
        //可以看作是一个新的mergedlist,用来被构建
        ListNode listNode;
        //初始化listNode的第一个节点
        if(l1.val < l2.val){
            listNode = l1;
            l1 = l1.next;
        }else{
            listNode = l2;
            l2 = l2.next;
        }
        //留作返回的headNode,因为上面的listNode要不断往后迭代
        ListNode headNode = listNode;
        
        while(l1 != null && l2 != null){
            if(l1.val < l2.val){
                listNode.next = l1;
                listNode = listNode.next;
                l1 = l1.next;
            }else{
                listNode.next = l2;
                listNode = listNode.next;
                l2 = l2.next;
            }
        }
        //l1或l2比较长的那个,剩下节点直接接在结果list的后面
        if(l1 == null){
            listNode.next = l2;
        }
        if(l2 == null){
            listNode.next = l1;
        }
        return headNode;
    }
}

 // 20180702 简洁点

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        ListNode head = new ListNode(0);
        ListNode cur = head;
        while (l1 != null && l2 != null) {
            if (l1.val < l2.val) {
                cur.next = l1;
                l1 = l1.next;
            } else {
                cur.next = l2;
                l2 = l2.next;
            }
            cur = cur.next;
        }
        if (l1 == null) {
            cur.next = l2;
        } else {
            cur.next = l1;
        }        
        return head.next;
    }
}

 

posted on 2015-01-31 23:11  NickyYe  阅读(188)  评论(0编辑  收藏  举报