# leetcode21.合并两个有序链表

### 题目描述

将两个升序链表合并为一个新的 **升序** 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。&#x20;

&#x20;

**示例 1：**

![](https://assets.leetcode.com/uploads/2020/10/03/merge_ex1.jpg)

<pre><code><strong>输入：l1 = [1,2,4], l2 = [1,3,4]
</strong><strong>输出：[1,1,2,3,4,4]
</strong></code></pre>

**示例 2：**

<pre><code><strong>输入：l1 = [], l2 = []
</strong><strong>输出：[]
</strong></code></pre>

**示例 3：**

<pre><code><strong>输入：l1 = [], l2 = [0]
</strong><strong>输出：[0]
</strong></code></pre>

&#x20;

**提示：**

* 两个链表的节点数目范围是 `[0, 50]`
* `-100 <= Node.val <= 100`
* `l1` 和 `l2` 均按 **非递减顺序** 排列



### 思路

* 循环比较两个链表的大小，值小的赋值到结果链表上面
* 链表的.Next时机
* 链表长度不同怎么处理





```go
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode {
   dummy:=&ListNode{-1,nil}
   p:=dummy

   for list1!=nil&&list2!=nil{
       if list1.Val<list2.Val{
           p.Next=list1
           list1=list1.Next
       }else{
           p.Next=list2
           list2=list2.Next
       }
       p=p.Next
       

   }

   if list1!=nil{
           p.Next=list1
    }

    if list2!=nil{
           p.Next=list2
    }
    return dummy.Next
   
}
```

