合并两个有序链表~字节手撕算法

152 阅读1分钟

剑指 Offer 25. 合并两个排序的链表

Difficulty: 简单

输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。

示例1:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

限制:

0 <= 链表长度 <= 1000

注意:本题与主站 21 题相同:

Solution

Language: java

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param l1 ListNode类 
     * @param l2 ListNode类 
     * @return ListNode类
     */
    public ListNode mergeTwoLists (ListNode l1, ListNode l2) {
        if(l1 == null) return l2;
        if(l2 == null) return l1;
        // write code here
        ListNode dummy = new ListNode(0);
        ListNode current = dummy;
        while(l1 != null &&  l2 != null)
        {
            int v1 = l1.val;
            int v2 = l2.val;
            if(v1 > v2)
            {
                ListNode node = new ListNode(v2);
                current.next = node;
                current = current.next;
                l2 = l2.next;
            }
            else if(v1 < v2)
            {
                ListNode node = new ListNode(v1);
                current.next = node;
                current = current.next;
                l1 = l1.next;
            }
            else{
                ListNode node = new ListNode(v1);
                current.next = node;
                current = current.next;
                
                ListNode node2 = new ListNode(v2);
                current.next = node2;
                current = current.next;
                l1 = l1.next;
                l2 = l2.next;
            }
             
            
        }
        while(l1 != null)
        {
            int v1 = l1.val;
               ListNode node = new ListNode(v1);
                current.next = node;
                current = current.next;
            l1 = l1.next;
        }
         while(l2 != null)
         {
            int v2 = l2.val;
               ListNode node = new ListNode(v2);
                current.next = node;
                current = current.next;
             l2 = l2.next;
        }
        return dummy.next;
    }
}
  • 这种方式代码重复率太高了,我们试着优化下
import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param l1 ListNode类 
     * @param l2 ListNode类 
     * @return ListNode类
     */
    public ListNode mergeTwoLists (ListNode l1, ListNode l2) {
         ListNode dummy = new ListNode(0);
         ListNode current = dummy;
        while(l1 != null && l2 != null)
        {
            if(l1.val > l2.val)
            {
                current.next = new ListNode(l2.val);
                l2 = l2.next;
            }
            else
            {
                current.next = new ListNode(l1.val);
                l1 = l1.next;
            }
            current = current.next;
        }
        
        current.next = l1 == null ? l2 : l1;
        return dummy.next;
    }
}