将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-two-sorted-lists
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
递归方法:
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
//如果一个链表为空则返回另外一个链表
if l1==nil{
return l2
}
if l2==nil{
return l1
}
var node *ListNode
if l1.Val>=l2.Val{
node=l2
node.Next=mergeTwoLists(l1, l2.Next)
}else{
node=l1
node.Next=mergeTwoLists(l1.Next,l2)
}
return node
}
非递归方法:
- 选择第一个节点值较小的链表作为新链表头节点
- 依次比较两个节点的值大小,将新链表尾指向值较小的节点
- 如果一个链表遍历完,另一个链表还有剩余节点则把剩余节点直接附加
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
//如果一个链表为空则返回另外一个链表
if l1==nil{
return l2
}
if l2==nil{
return l1
}
var head *ListNode
var cur *ListNode
//第一个较小节点做新链表头节点
if l1.Val>l2.Val{
head=l2
cur=l2
l2=l2.Next
}else{
head=l1;
cur=l1
l1=l1.Next
}
//遍历到小链表尾
for l1!=nil&&l2!=nil{
if l1.Val<l2.Val{
cur.Next=l1
l1=l1.Next
}else{
cur.Next=l2
l2=l2.Next
}
//更新指针
cur=cur.Next
}
//遍历完小链表,将较长链表剩余节点附加在结果后
if l2==nil{
cur.Next=l1
}
if l1==nil{
cur.Next=l2
}
return head
}