递归 
      
    
      
      
      
        链表 
      
    
   
  
    
      
       
     
  
  
    
      
    
    
      
       
     
  
题目描述 
将两个升序链表合并为一个新的 升序  链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 
 
示例 1: 
输入: l1 = [1,2,4], l2 = [1,3,4]
输出: [1,1,2,3,4,4]
 
示例 2: 
输入: l1 = [], l2 = []
输出: []
 
示例 3: 
输入: l1 = [], l2 = [0]
输出: [0]
 
 
提示: 
    两个链表的节点数目范围是 [0, 50] 
    -100 <= Node.val <= 100 
    l1 和 l2 均按 非递减顺序  排列 
 
解法 
方法一:递归 
我们先判断链表 \(l_1\)  和 \(l_2\)  是否为空,若其中一个为空,则返回另一个链表。否则,我们比较 \(l_1\)  和 \(l_2\)  的头节点:
若 \(l_1\)  的头节点的值小于等于 \(l_2\)  的头节点的值,则递归调用函数 \(mergeTwoLists(l_1.next, l_2)\) ,并将 \(l_1\)  的头节点与返回的链表头节点相连,返回 \(l_1\)  的头节点。 
否则,递归调用函数 \(mergeTwoLists(l_1, l_2.next)\) ,并将 \(l_2\)  的头节点与返回的链表头节点相连,返回 \(l_2\)  的头节点。 
 
时间复杂度 \(O(m + n)\) ,空间复杂度 \(O(m + n)\) 。其中 \(m\)  和 \(n\)  分别为两个链表的长度。
Python3 Java C++ Go TypeScript Rust JavaScript C# Ruby PHP 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 # Definition for singly-linked list. 
# class ListNode: 
#     def __init__(self, val=0, next=None): 
#         self.val = val 
#         self.next = next 
class   Solution : 
    def   mergeTwoLists ( 
        self ,  list1 :  Optional [ ListNode ],  list2 :  Optional [ ListNode ] 
    )  ->  Optional [ ListNode ]: 
        if  list1  is  None  or  list2  is  None : 
            return  list1  or  list2 
        if  list1 . val  <=  list2 . val : 
            list1 . next  =  self . mergeTwoLists ( list1 . next ,  list2 ) 
            return  list1 
        else : 
            list2 . next  =  self . mergeTwoLists ( list1 ,  list2 . next ) 
            return  list2 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 /** 
 * Definition for singly-linked list. 
 * public class ListNode { 
 *     int val; 
 *     ListNode next; 
 *     ListNode() {} 
 *     ListNode(int val) { this.val = val; } 
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; } 
 * } 
 */ 
class  Solution   { 
     public   ListNode   mergeTwoLists ( ListNode   list1 ,   ListNode   list2 )   { 
         if   ( list1   ==   null )   { 
             return   list2 ; 
         } 
         if   ( list2   ==   null )   { 
             return   list1 ; 
         } 
         if   ( list1 . val   <=   list2 . val )   { 
             list1 . next   =   mergeTwoLists ( list1 . next ,   list2 ); 
             return   list1 ; 
         }   else   { 
             list2 . next   =   mergeTwoLists ( list1 ,   list2 . next ); 
             return   list2 ; 
         } 
     } 
} 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 /** 
 * Definition for singly-linked list. 
 * struct ListNode { 
 *     int val; 
 *     ListNode *next; 
 *     ListNode() : val(0), next(nullptr) {} 
 *     ListNode(int x) : val(x), next(nullptr) {} 
 *     ListNode(int x, ListNode *next) : val(x), next(next) {} 
 * }; 
 */ 
class   Solution   { 
public : 
     ListNode *   mergeTwoLists ( ListNode *   list1 ,   ListNode *   list2 )   { 
         if   ( ! list1 )   return   list2 ; 
         if   ( ! list2 )   return   list1 ; 
         if   ( list1 -> val   <=   list2 -> val )   { 
             list1 -> next   =   mergeTwoLists ( list1 -> next ,   list2 ); 
             return   list1 ; 
         }   else   { 
             list2 -> next   =   mergeTwoLists ( list1 ,   list2 -> next ); 
             return   list2 ; 
         } 
     } 
}; 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 /** 
 * Definition for singly-linked list. 
 * type ListNode struct { 
 *     Val int 
 *     Next *ListNode 
 * } 
 */ 
func   mergeTwoLists ( list1   * ListNode ,   list2   * ListNode )   * ListNode   { 
     if   list1   ==   nil   { 
         return   list2 
     } 
     if   list2   ==   nil   { 
         return   list1 
     } 
     if   list1 . Val   <=   list2 . Val   { 
         list1 . Next   =   mergeTwoLists ( list1 . Next ,   list2 ) 
         return   list1 
     }   else   { 
         list2 . Next   =   mergeTwoLists ( list1 ,   list2 . Next ) 
         return   list2 
     } 
} 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 /** 
 * Definition for singly-linked list. 
 * class ListNode { 
 *     val: number 
 *     next: ListNode | null 
 *     constructor(val?: number, next?: ListNode | null) { 
 *         this.val = (val===undefined ? 0 : val) 
 *         this.next = (next===undefined ? null : next) 
 *     } 
 * } 
 */ 
function   mergeTwoLists ( list1 :   ListNode   |   null ,   list2 :   ListNode   |   null ) :   ListNode   |   null   { 
     if   ( list1   ==   null   ||   list2   ==   null )   { 
         return   list1   ||   list2 ; 
     } 
     if   ( list1 . val   <   list2 . val )   { 
         list1 . next   =   mergeTwoLists ( list1 . next ,   list2 ); 
         return   list1 ; 
     }   else   { 
         list2 . next   =   mergeTwoLists ( list1 ,   list2 . next ); 
         return   list2 ; 
     } 
} 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 // Definition for singly-linked list. 
// #[derive(PartialEq, Eq, Clone, Debug)] 
// pub struct ListNode { 
//   pub val: i32, 
//   pub next: Option<Box<ListNode>> 
// } 
// 
// impl ListNode { 
//   #[inline] 
//   fn new(val: i32) -> Self { 
//     ListNode { 
//       next: None, 
//       val 
//     } 
//   } 
// } 
impl   Solution   { 
     pub   fn   merge_two_lists ( 
         list1 :   Option < Box < ListNode >> , 
         list2 :   Option < Box < ListNode >> , 
     )   ->   Option < Box < ListNode >>   { 
         match   ( list1 ,   list2 )   { 
             ( None ,   None )   =>   None , 
             ( Some ( list ),   None )   =>   Some ( list ), 
             ( None ,   Some ( list ))   =>   Some ( list ), 
             ( Some ( mut   list1 ),   Some ( mut   list2 ))   =>   { 
                 if   list1 . val   <   list2 . val   { 
                     list1 . next   =   Self :: merge_two_lists ( list1 . next ,   Some ( list2 )); 
                     Some ( list1 ) 
                 }   else   { 
                     list2 . next   =   Self :: merge_two_lists ( Some ( list1 ),   list2 . next ); 
                     Some ( list2 ) 
                 } 
             } 
         } 
     } 
} 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 /** 
 * Definition for singly-linked list. 
 * function ListNode(val, next) { 
 *     this.val = (val===undefined ? 0 : val) 
 *     this.next = (next===undefined ? null : next) 
 * } 
 */ 
/** 
 * @param {ListNode} list1 
 * @param {ListNode} list2 
 * @return {ListNode} 
 */ 
var   mergeTwoLists   =   function   ( list1 ,   list2 )   { 
     if   ( ! list1   ||   ! list2 )   { 
         return   list1   ||   list2 ; 
     } 
     if   ( list1 . val   <=   list2 . val )   { 
         list1 . next   =   mergeTwoLists ( list1 . next ,   list2 ); 
         return   list1 ; 
     }   else   { 
         list2 . next   =   mergeTwoLists ( list1 ,   list2 . next ); 
         return   list2 ; 
     } 
}; 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 /** 
 * Definition for singly-linked list. 
 * public class ListNode { 
 *     public int val; 
 *     public ListNode next; 
 *     public ListNode(int val=0, ListNode next=null) { 
 *         this.val = val; 
 *         this.next = next; 
 *     } 
 * } 
 */ 
public   class   Solution   { 
     public   ListNode   MergeTwoLists ( ListNode   list1 ,   ListNode   list2 )   { 
         if   ( list1   ==   null )   { 
             return   list2 ; 
         } 
         if   ( list2   ==   null )   { 
             return   list1 ; 
         } 
         if   ( list1 . val   <=   list2 . val )   { 
             list1 . next   =   MergeTwoLists ( list1 . next ,   list2 ); 
             return   list1 ; 
         }   else   { 
             list2 . next   =   MergeTwoLists ( list1 ,   list2 . next ); 
             return   list2 ; 
         } 
     } 
} 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 # Definition for singly-linked list. 
# class ListNode 
#     attr_accessor :val, :next 
#     def initialize(val = 0, _next = nil) 
#         @val = val 
#         @next = _next 
#     end 
# end 
# @param {ListNode} list1 
# @param {ListNode} list2 
# @return {ListNode} 
def   merge_two_lists ( list1 ,   list2 ) 
     if   list1 . nil? 
         return   list2 
     end 
     if   list2 . nil? 
         return   list1 
     end 
     if   list1 . val   <=   list2 . val 
         list1 . next   =   merge_two_lists ( list1 . next ,   list2 ) 
         return   list1 
     else 
         list2 . next   =   merge_two_lists ( list1 ,   list2 . next ) 
         return   list2 
     end 
end 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 /** 
 * Definition for a singly-linked list. 
 * class ListNode { 
 *     public $val = 0; 
 *     public $next = null; 
 *     function __construct($val = 0, $next = null) { 
 *         $this->val = $val; 
 *         $this->next = $next; 
 *     } 
 * } 
 */ 
class  Solution  { 
    /** 
     * @param ListNode $list1 
     * @param ListNode $list2 
     * @return ListNode 
     */ 
    function  mergeTwoLists ( $list1 ,  $list2 )  { 
        if  ( is_null ( $list1 ))  { 
            return  $list2 ; 
        } 
        if  ( is_null ( $list2 ))  { 
            return  $list1 ; 
        } 
        if  ( $list1 -> val  <=  $list2 -> val )  { 
            $list1 -> next  =  $this -> mergeTwoLists ( $list1 -> next ,  $list2 ); 
            return  $list1 ; 
        }  else  { 
            $list2 -> next  =  $this -> mergeTwoLists ( $list1 ,  $list2 -> next ); 
            return  $list2 ; 
        } 
    } 
} 
 
 
 
 
方法二:迭代 
我们也可以用迭代的方式来实现两个排序链表的合并。
我们先定义一个虚拟头节点 \(dummy\) ,然后循环遍历两个链表,比较两个链表的头节点,将较小的节点添加到 \(dummy\)  的末尾,直到其中一个链表为空,然后将另一个链表的剩余部分添加到 \(dummy\)  的末尾。
最后返回 \(dummy.next\)  即可。
时间复杂度 \(O(m + n)\) ,其中 \(m\)  和 \(n\)  分别为两个链表的长度。忽略答案链表的空间消耗,空间复杂度 \(O(1)\) 。
Python3 Java C++ Go TypeScript Rust JavaScript C# Ruby PHP 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 # Definition for singly-linked list. 
# class ListNode: 
#     def __init__(self, val=0, next=None): 
#         self.val = val 
#         self.next = next 
class   Solution : 
    def   mergeTwoLists ( 
        self ,  list1 :  Optional [ ListNode ],  list2 :  Optional [ ListNode ] 
    )  ->  Optional [ ListNode ]: 
        dummy  =  ListNode () 
        curr  =  dummy 
        while  list1  and  list2 : 
            if  list1 . val  <=  list2 . val : 
                curr . next  =  list1 
                list1  =  list1 . next 
            else : 
                curr . next  =  list2 
                list2  =  list2 . next 
            curr  =  curr . next 
        curr . next  =  list1  or  list2 
        return  dummy . next 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 /** 
 * Definition for singly-linked list. 
 * public class ListNode { 
 *     int val; 
 *     ListNode next; 
 *     ListNode() {} 
 *     ListNode(int val) { this.val = val; } 
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; } 
 * } 
 */ 
class  Solution   { 
     public   ListNode   mergeTwoLists ( ListNode   list1 ,   ListNode   list2 )   { 
         ListNode   dummy   =   new   ListNode (); 
         ListNode   curr   =   dummy ; 
         while   ( list1   !=   null   &&   list2   !=   null )   { 
             if   ( list1 . val   <=   list2 . val )   { 
                 curr . next   =   list1 ; 
                 list1   =   list1 . next ; 
             }   else   { 
                 curr . next   =   list2 ; 
                 list2   =   list2 . next ; 
             } 
             curr   =   curr . next ; 
         } 
         curr . next   =   list1   ==   null   ?   list2   :   list1 ; 
         return   dummy . next ; 
     } 
} 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 /** 
 * Definition for singly-linked list. 
 * struct ListNode { 
 *     int val; 
 *     ListNode *next; 
 *     ListNode() : val(0), next(nullptr) {} 
 *     ListNode(int x) : val(x), next(nullptr) {} 
 *     ListNode(int x, ListNode *next) : val(x), next(next) {} 
 * }; 
 */ 
class   Solution   { 
public : 
     ListNode *   mergeTwoLists ( ListNode *   list1 ,   ListNode *   list2 )   { 
         ListNode *   dummy   =   new   ListNode (); 
         ListNode *   curr   =   dummy ; 
         while   ( list1   &&   list2 )   { 
             if   ( list1 -> val   <=   list2 -> val )   { 
                 curr -> next   =   list1 ; 
                 list1   =   list1 -> next ; 
             }   else   { 
                 curr -> next   =   list2 ; 
                 list2   =   list2 -> next ; 
             } 
             curr   =   curr -> next ; 
         } 
         curr -> next   =   list1   ?   list1   :   list2 ; 
         return   dummy -> next ; 
     } 
}; 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 /** 
 * Definition for singly-linked list. 
 * type ListNode struct { 
 *     Val int 
 *     Next *ListNode 
 * } 
 */ 
func   mergeTwoLists ( list1   * ListNode ,   list2   * ListNode )   * ListNode   { 
     dummy   :=   & ListNode {} 
     curr   :=   dummy 
     for   list1   !=   nil   &&   list2   !=   nil   { 
         if   list1 . Val   <=   list2 . Val   { 
             curr . Next   =   list1 
             list1   =   list1 . Next 
         }   else   { 
             curr . Next   =   list2 
             list2   =   list2 . Next 
         } 
         curr   =   curr . Next 
     } 
     if   list1   !=   nil   { 
         curr . Next   =   list1 
     }   else   { 
         curr . Next   =   list2 
     } 
     return   dummy . Next 
} 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 /** 
 * Definition for singly-linked list. 
 * class ListNode { 
 *     val: number 
 *     next: ListNode | null 
 *     constructor(val?: number, next?: ListNode | null) { 
 *         this.val = (val===undefined ? 0 : val) 
 *         this.next = (next===undefined ? null : next) 
 *     } 
 * } 
 */ 
function   mergeTwoLists ( list1 :   ListNode   |   null ,   list2 :   ListNode   |   null ) :   ListNode   |   null   { 
     const   dummy   =   new   ListNode ( 0 ); 
     let   cur   =   dummy ; 
     while   ( list1   !=   null   &&   list2   !=   null )   { 
         if   ( list1 . val   <   list2 . val )   { 
             cur . next   =   list1 ; 
             list1   =   list1 . next ; 
         }   else   { 
             cur . next   =   list2 ; 
             list2   =   list2 . next ; 
         } 
         cur   =   cur . next ; 
     } 
     cur . next   =   list1   ||   list2 ; 
     return   dummy . next ; 
} 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 // Definition for singly-linked list. 
// #[derive(PartialEq, Eq, Clone, Debug)] 
// pub struct ListNode { 
//   pub val: i32, 
//   pub next: Option<Box<ListNode>> 
// } 
// 
// impl ListNode { 
//   #[inline] 
//   fn new(val: i32) -> Self { 
//     ListNode { 
//       next: None, 
//       val 
//     } 
//   } 
// } 
impl   Solution   { 
     pub   fn   merge_two_lists ( 
         mut   list1 :   Option < Box < ListNode >> , 
         mut   list2 :   Option < Box < ListNode >> , 
     )   ->   Option < Box < ListNode >>   { 
         let   mut   new_list   =   ListNode :: new ( 0 ); 
         let   mut   cur   =   & mut   new_list ; 
         while   list1 . is_some ()   &&   list2 . is_some ()   { 
             let   ( l1 ,   l2 )   =   ( list1 . as_deref_mut (). unwrap (),   list2 . as_deref_mut (). unwrap ()); 
             if   l1 . val   <   l2 . val   { 
                 let   next   =   l1 . next . take (); 
                 cur . next   =   list1 . take (); 
                 list1   =   next ; 
             }   else   { 
                 let   next   =   l2 . next . take (); 
                 cur . next   =   list2 . take (); 
                 list2   =   next ; 
             } 
             cur   =   cur . next . as_deref_mut (). unwrap (); 
         } 
         cur . next   =   list1 . or ( list2 ); 
         new_list . next 
     } 
} 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 /** 
 * Definition for singly-linked list. 
 * function ListNode(val, next) { 
 *     this.val = (val===undefined ? 0 : val) 
 *     this.next = (next===undefined ? null : next) 
 * } 
 */ 
/** 
 * @param {ListNode} list1 
 * @param {ListNode} list2 
 * @return {ListNode} 
 */ 
var   mergeTwoLists   =   function   ( list1 ,   list2 )   { 
     const   dummy   =   new   ListNode (); 
     let   curr   =   dummy ; 
     while   ( list1   &&   list2 )   { 
         if   ( list1 . val   <=   list2 . val )   { 
             curr . next   =   list1 ; 
             list1   =   list1 . next ; 
         }   else   { 
             curr . next   =   list2 ; 
             list2   =   list2 . next ; 
         } 
         curr   =   curr . next ; 
     } 
     curr . next   =   list1   ||   list2 ; 
     return   dummy . next ; 
}; 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 /** 
 * Definition for singly-linked list. 
 * public class ListNode { 
 *     public int val; 
 *     public ListNode next; 
 *     public ListNode(int val=0, ListNode next=null) { 
 *         this.val = val; 
 *         this.next = next; 
 *     } 
 * } 
 */ 
public   class   Solution   { 
     public   ListNode   MergeTwoLists ( ListNode   list1 ,   ListNode   list2 )   { 
         ListNode   dummy   =   new   ListNode (); 
         ListNode   curr   =   dummy ; 
         while   ( list1   !=   null   &&   list2   !=   null )   { 
             if   ( list1 . val   <=   list2 . val )   { 
                 curr . next   =   list1 ; 
                 list1   =   list1 . next ; 
             }   else   { 
                 curr . next   =   list2 ; 
                 list2   =   list2 . next ; 
             } 
             curr   =   curr . next ; 
         } 
         curr . next   =   list1   ==   null   ?   list2   :   list1 ; 
         return   dummy . next ; 
     } 
} 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 # Definition for singly-linked list. 
# class ListNode 
#     attr_accessor :val, :next 
#     def initialize(val = 0, _next = nil) 
#         @val = val 
#         @next = _next 
#     end 
# end 
# @param {ListNode} list1 
# @param {ListNode} list2 
# @return {ListNode} 
def   merge_two_lists ( list1 ,   list2 ) 
     dummy   =   ListNode . new () 
     cur   =   dummy 
     while   list1   &&   list2 
         if   list1 . val   <=   list2 . val 
             cur . next   =   list1 
             list1   =   list1 . next 
         else 
             cur . next   =   list2 
             list2   =   list2 . next 
         end 
         cur   =   cur . next 
     end 
     cur . next   =   list1   ||   list2 
     dummy . next 
end 
 
 
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 # Definition for singly-linked list. 
# class ListNode { 
#     public $val; 
#     public $next; 
#     public function __construct($val = 0, $next = null) 
#     { 
#         $this->val = $val; 
#         $this->next = $next; 
#     } 
# } 
class  Solution  { 
    /** 
     * @param ListNode $list1 
     * @param ListNode $list2 
     * @return ListNode 
     */ 
    function  mergeTwoLists ( $list1 ,  $list2 )  { 
        $dummy  =  new  ListNode ( 0 ); 
        $current  =  $dummy ; 
        while  ( $list1  !=  null  &&  $list2  !=  null )  { 
            if  ( $list1 -> val  <=  $list2 -> val )  { 
                $current -> next  =  $list1 ; 
                $list1  =  $list1 -> next ; 
            }  else  { 
                $current -> next  =  $list2 ; 
                $list2  =  $list2 -> next ; 
            } 
            $current  =  $current -> next ; 
        } 
        if  ( $list1  !=  null )  { 
            $current -> next  =  $list1 ; 
        }  elseif  ( $list2  !=  null )  { 
            $current -> next  =  $list2 ; 
        } 
        return  $dummy -> next ; 
    } 
}